{"version":3,"sources":["data/constants.ts","styles/mediaQuery.ts","components/App.styles.tsx","hooks/useSupercluster.ts","components/atoms/AbstractButton/AbstractButton.tsx","styles/helpers/respondTo.ts","styles/easing.ts","styles/variables.ts","styles/helpers/pseudo.ts","styles/helpers/hover.ts","components/atoms/Heading/Heading.data.ts","components/atoms/Paragraph/Paragraph.data.ts","styles/typeStyle.ts","components/atoms/Icon/svg/airplane.svg","styles/zIndex.ts","components/organisms/MapContainer/MapContainer.styles.tsx","utils/createContext.tsx","components/atoms/Icon/svg/construction.svg","components/atoms/Icon/svg/close.svg","components/atoms/Icon/svg/clock.svg","components/atoms/Icon/svg/checked.svg","components/atoms/Icon/svg/chevron-down.svg","components/atoms/Icon/svg/globe.svg","components/atoms/Icon/svg/info.svg","components/atoms/Icon/svg/list.svg","components/atoms/Icon/svg/location-arrow.svg","components/atoms/Icon/svg/point.svg","components/atoms/Icon/svg/traffic-cone.svg","components/atoms/Icon/svg/umbrella.svg","components/atoms/Icon/Icon.tsx","hooks/useRouteLine.ts","components/atoms/Paragraph/Paragraph.styles.ts","components/atoms/Paragraph/Paragraph.tsx","components/molecules/InformationContent/InformationContent.styles.tsx","components/molecules/InformationContent/InformationContent.tsx","hooks/useExternalValue.ts","utils/checkFlightType.ts","styles/theme/default.ts","components/molecules/Button/Button.styles.tsx","components/molecules/Button/Button.tsx","components/organisms/FallbackMap/FallbackMap.styles.tsx","assets/images/fallback-map.jpg","components/atoms/Image/Image.styles.tsx","components/atoms/Image/Image.tsx","components/atoms/Heading/Heading.styles.ts","components/atoms/Heading/Heading.tsx","components/molecules/ListViewButton/ListViewButton.styles.tsx","components/molecules/ListViewButton/ListViewButton.tsx","components/organisms/FallbackMap/FallbackMap.tsx","components/organisms/FareComponent/FareComponent.tsx","components/organisms/MapContainer/MapContainer.tsx","data/keys.ts","components/molecules/Checkbox/Checkbox.styles.tsx","components/organisms/MapNavigation/MapNavigation.styles.tsx","components/molecules/Checkbox/Checkbox.tsx","components/molecules/LocationSelector/LocationSelector.styles.tsx","components/molecules/CurrentLocation/CurrentLocation.styles.tsx","components/molecules/CurrentLocation/CurrentLocation.tsx","hooks/useAlphabeticList.ts","utils/checkAirport.ts","components/molecules/LocationSelector/LocationSelector.tsx","hooks/useMount.ts","hooks/useUnmount.ts","utils/sanitiseHtml.ts","components/organisms/MapNavigation/MapNavigation.tsx","components/organisms/WidgetContainer/WidgetContainer.styles.tsx","components/organisms/InsetMap/InsetMap.styles.tsx","assets/images/hawaii.png","components/organisms/InsetMap/InsetMap.tsx","components/molecules/DisabledModal/Modal.styles.tsx","components/molecules/DisabledModal/Backdrop/Backdrop.styles.tsx","components/molecules/DisabledModal/Backdrop/Backdrop.tsx","components/molecules/DisabledModal/Modal.tsx","components/organisms/WidgetContainer/WidgetContainer.tsx","components/App.tsx","hooks/useMessages.ts","reportWebVitals.ts","styles/GlobalStyle.tsx","index.tsx"],"names":["ZoomLevels","LOCALE","navigator","language","MediaQuery","StyledMainContent","styled","main","useSupercluster","points","bounds","zoom","options","superclusterRef","useRef","pointsRef","useState","clusters","setClusters","zoomInt","Math","round","useDeepCompareEffectNoCheck","current","dequal","Supercluster","load","data","getClusters","parsedClustersData","filter","properties","cluster","reduce","clustersAccumulator","currentCluster","airports","id","getLeaves","Number","parsedPointsData","supercluster","AbstractButton","React","forwardRef","ref","href","enforceLink","type","props","startsWith","to","rel","Ease","TransitionDuration","FontWeight","FontSize","FontFamily","respondTo","query","pseudo","display","position","content","hover","HeadingType","ParagraphType","_path","typeStyle","H1","css","Bold","Intro","Normal","CallToAction","Large","Small","map","zIndex","name","findIndex","itemName","StyledMapContainer","div","size","StyledMarker","Marker","$isPopulair","$isCluster","$isActive","Medium","StyledLocationName","normal","theme","color","white","black","Slow","EaseOutBack","defaultCssProps","borderRadius","xSmall","blue","grey","$isSuspended","orange","lighterGrey","$isConnected","$isInSeasonalService","darkerGrey","clusterBlue","$isUnserved","$nonStopOnly","$pointCount","StyledClusterNumber","$isNumber","$isNonstop","StyledLocationDot","$unavailable","StyledNavigationControl","NavigationControl","lightBlack","small","rgba","lightGrey","StyledGlobeButton","EaseOut","StyleLocationContainerWithFare","AppContext","createContext","_excluded","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgAirplane","_ref","svgRef","title","titleId","xmlns","viewBox","d","fill","fillRule","ForwardRef","SvgConstruction","SvgClose","SvgClock","SvgChecked","SvgChevronDown","SvgGlobe","SvgInfo","SvgList","SvgLocationArrow","SvgPoint","SvgTrafficCone","SvgUmbrella","Icon","Airplane","Construction","Close","Clock","Checkmark","ChevronDown","TrafficCone","Info","List","LocationArrow","Point","Umbrella","Globe","useRouteLine","originAirport","destinationAirport","curved","setCurved","useEffect","airport_name","start","projection","parseFloat","longitude","latitude","end","distance","turf","midpoint","bearing","destination","curvedLine","steps","mercatorCurvedLine","StyledParagraph","p","$type","$fontWeight","Paragraph","forwardedAs","as","fontWeight","ParagraphId","StyledInformationWrapper","motion","$isOpen","$isTablet","$hasMessage","$isFocussed","StyledInformationButton","button","StyledCloseButton","span","StyledInformationContent","StyledInformationBlock","StyledIcon","img","StyledInformationDescription","StyledFlightInformation","$connected","InformationContent","outsideData","keyword","undefined","items","setItems","a","fetch","response","json","console","error","useExternalValue","infoRef","toggleButtonRef","infoModalOpen","setInfoModalOpen","isTablet","useMedia","hasMessage","document","querySelector","textContent","isFocussed","setIsFocussed","useEvent","event","handleKeydown","initial","layout","aria-label","onClick","defaultMessage","message","disabled","tabIndex","customMessage","index","label","src","icon","alt","isUnserved","origin","iata_code","unserved","includes","isConnected","connected","darkerBlue","yellow","disabledCss","StyledButtonContent","StyledButton","Button","noop","children","currentTarget","blur","StyledFallbackMap","StyledMessageWrapper","XLarge","StyledClockIcon","coverCss","containCss","aspectRatioCss","StyledImage","$cover","$contain","StyledPicture","picture","$aspectRatio","StyledImageElement","Image","width","height","aspectRatio","className","cover","contain","preload","roundedBorder","$roundedBorder","media","srcset","data-srcset","StyledHeading","h1","Heading","StyledListViewButton","ListViewButton","FallbackMap","location","reload","FareComponent","useContext","selectedRoute","msg","routePrice","priceHash","departureDate","format","add","Date","now","days","setDate","returnDate","departureDateMobile","returnDateMobile","isMobile","XSmall","submitUrl","currentUrl","window","isMweb","RegExp","isIos","isAndroid","isIpad","test","FareMessage","NoFareMessage","style","padding","marginTop","textDecoration","SelectionMessage","Message","MapContainer","viewport","setViewport","airportsData","setPoints","setOriginAirport","setDestinationAirport","setFlightType","nonstopChecked","setGoToHawaii","mapboxKey","mapboxStyleUrl","mapFailed","setMapFailed","setShowDisabledModal","setShowDisabledModalConnection","isDesktop","features","route","setRoute","mapRef","showNumbers","useExternalBoolean","showLabels","useExternalBooleanLabels","airportPoints","airport","category","federal_unit","geometry","coordinates","getMap","getBounds","toArray","flat","radius","maxZoom","handleAirportClick","suspended","nonstop","departMessage","returnMessage","clusterGroups","isCluster","pointCount","point_count","unservedAirport","selected","popularStation","majorHub","find","currentAirport","major_hub","Middle","popular_station","unservedCluster","connectingCluster","nonstopCluster","transitionInterpolator","FlyToInterpolator","speed","transitionDuration","handleClusterClickZoom","expansionZoom","min","getClusterExpansionZoom","handleClusterClick","city_served","zoomLevelMiddleAndPopularStation","zoomLevelInnermost","Innermost","selectedOnMobile","mobileCluster","isDisabled","operational","seasonal_service","route_map_display_name","mapboxApiAccessToken","onViewportChange","mapStyle","minZoom","OutermostDesktop","OutermostMobile","onError","attributionControl","paint","showCompass","mapboxgl","workerClass","require","default","LocalStorageKey","StyledText","StyledLabel","$isDisabled","StyledInput","input","StyledMapNavigation","StyledScrollWrapper","SimpleBar","$openSelector","StyledIntroText","StyledSubmitButton","StyledFlightSummary","StyledFlightTypeIndicator","$flightType","StyledFlightLocation","StyledFlightType","StyledAdditionalInformation","StyledCheckbox","checked","onChange","StyledLocationSelector","StyledInputWrapper","StyledOverlayLabel","StyledPlaceholder","large","ellipsis","StyledAirplaneIcon","$isDeparture","StyledChevron","StyledClearButton","StyledResultWrapper","StyledResultList","ul","$additionalSpace","StyledDivider","StyledListItem","StyledCurrentLocation","loader","keyframes","StyledLoader","StyledSpinner","EaseInOutCirc","StyledLocationArrow","CurrentLocation","onLocationChange","setUserLocation","setUserLocationError","searching","geolocation","getCurrentPosition","geo","currentLocation","coords","code","nearestPoint","nearestAirport","handleCurrentLocation","useAlphabeticList","list","setList","alphabeticAirportsList","accumulator","firstLetter","booking_widget_display_name","toLocaleLowerCase","some","item","letter","letterObject","object","letterObjectIndex","push","sort","b","localeCompare","isCurrent","LocationSelector","setLocation","isDeparture","placeholder","overlayLabel","isOpen","setIsOpen","showDisabledModal","userLocationError","alphabeticList","setQuery","isChosen","setIsChosen","searchSuggestions","setSearchSuggestions","useLocalStorage","RecentSearches","recentSearches","setRecentSearches","wrapperRef","placeholderRef","inputRef","scrollRef","focus","callback","destructor","fuse","Fuse","minMatchCharLength","includeScore","threshold","closeModal","clearAllBodyScrollLocks","toggleModal","setTimeout","disableBodyScroll","getScrollElement","temporarySearchesArray","locationItem","splice","handleBlur","contains","handleMousedown","addEventListener","removeEventListener","htmlFor","searchTerm","results","search","toLowerCase","handleSearchQuery","value","stopPropagation","handleRemoveLocation","autoHide","alphabeticObject","toUpperCase","parseHtml","htmlString","__html","sanitizeHtml","allowedTags","defaults","concat","allowedAttributes","MapNavigation","flightType","setNonstopChecked","intl","useIntl","originSelectorOpen","setOriginSelectorOpen","destinationSelectorOpen","setDestinationSelectorOpen","connectingFlightChosen","formatMessage","station_message","dangerouslySetInnerHTML","StyledWidgetContainer","StyledInsetMap","$routeActive","InsetMap","hawaiiCount","hawaiiNumber","hawaiiConnected","setHawaiiConnected","hawaiiUnserved","setHawaiiUnserved","hawaiiNonstop","setHawaiiNonstop","hawaiiAirports","r","data-reverse","Boolean","staticImage","StyledModal","StyledBackdrop","Backdrop","onBackdropClick","backdrop","body","useLockBodyScroll","backdropClickHandler","useCallback","nativeEvent","stopImmediatePropagation","ReactDOM","createPortal","getElementById","DisabledModal","onClose","isPersistent","DisabledModalConnection","WidgetContainer","setAirportsData","userLocation","goToHawaii","showDisabledModalConnection","setHawaiiCount","__swaMapboxKey","__swaMapboxStyleUrl","parseAirportsData","entries","then","array","operate_date","isBefore","parse","catch","log","hawaiiStations","fetchAirports","Provider","App","messages","setMessages","useMessages","locale","defaultLocale","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","GlobalStyle","createGlobalStyle","normalize","Arial","render","reportWebVitals"],"mappings":"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","file":"static/js/main.bf9ce706.chunk.js","sourcesContent":["// Client\nexport const LOCALE = navigator.language || 'en-GB';\n\n// eslint-disable-next-line no-shadow\nexport enum ZoomLevels { // default-zoom\n OutermostMobile = 2,\n InsetMobile = 2.3,\n OutermostDesktop = 3,\n Middle = 4,\n Hawaii = 4.7,\n Innermost = 5,\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n// eslint-disable-next-line no-shadow\nexport enum MediaQuery {\n XSmall = '(max-width: 479px)',\n Small = '(min-width: 480px)',\n Medium = '(min-width: 768px)',\n Large = '(min-width: 1024px)',\n XLarge = '(min-width: 1440px)',\n XXLarge = '(min-width: 1640px)',\n XXXLarge = '(min-width: 1920px)',\n}\n","import styled from 'styled-components';\n\nexport const StyledMainContent = styled.main`\n height: 100%;\n`;\n","/* eslint-disable no-param-reassign */\nimport { useRef, useState } from 'react';\nimport Supercluster from 'supercluster';\nimport type { BBox, GeoJsonProperties } from 'geojson';\nimport { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect';\nimport { dequal } from 'dequal';\n\nexport interface UseSuperclusterArgument<P, C> {\n points: Array<Supercluster.PointFeature<P>>;\n bounds?: BBox;\n zoom: number;\n options?: Supercluster.Options<P, C>;\n}\n\nconst useSupercluster = <\n P extends GeoJsonProperties = Supercluster.AnyProps,\n C extends GeoJsonProperties = Supercluster.AnyProps,\n>({\n points,\n bounds,\n zoom,\n options,\n}: UseSuperclusterArgument<P, C>) => {\n const superclusterRef = useRef<Supercluster<P, C>>();\n const pointsRef = useRef<Array<Supercluster.PointFeature<P>>>();\n const [clusters, setClusters] = useState<\n Array<Supercluster.ClusterFeature<C> | Supercluster.PointFeature<P>>\n >([]);\n const zoomInt = Math.round(zoom);\n\n useDeepCompareEffectNoCheck(() => {\n if (!superclusterRef.current || !dequal(pointsRef.current, points)) {\n superclusterRef.current = new Supercluster({\n ...options,\n });\n superclusterRef.current.load(points);\n }\n\n if (bounds) {\n const data = superclusterRef.current.getClusters(bounds, zoomInt);\n\n const parsedClustersData = data\n .filter(({ properties }) => properties?.cluster)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .reduce((clustersAccumulator, currentCluster): any => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (currentCluster as any).properties.airports =\n (currentCluster?.id && superclusterRef.current?.getLeaves(Number(currentCluster.id))) ??\n [];\n\n return [...clustersAccumulator, currentCluster];\n }, []);\n const parsedPointsData = data.filter(({ properties }) => !properties?.cluster);\n\n setClusters([...parsedClustersData, ...parsedPointsData]);\n }\n\n pointsRef.current = points;\n }, [points, bounds, zoomInt]);\n\n return { clusters, supercluster: superclusterRef.current };\n};\n\nexport default useSupercluster;\n","import React, { ComponentProps, ForwardedRef } from 'react';\nimport { Link } from 'react-router-dom';\n\nexport type AbstractButtonProps = ComponentProps<'a'> &\n ComponentProps<'button'> & { enforceLink?: boolean };\n\nexport const AbstractButton = React.forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n AbstractButtonProps\n>(({ href, enforceLink = false, type = 'button', ...props }, ref) => {\n if (href) {\n return href.startsWith('/') || !enforceLink ? (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <Link ref={ref as any} {...props} to={href} />\n ) : (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <a ref={ref as any} {...props} href={href} rel=\"noopener noreferrer\" />\n );\n }\n\n return (\n <button\n ref={ref as ForwardedRef<HTMLButtonElement>}\n // eslint-disable-next-line react/button-has-type\n type={type}\n {...props}\n />\n );\n});\n","import type { MediaQuery } from '../mediaQuery';\n\nexport const respondTo = (query: MediaQuery): string => `only screen and ${query}`;\n","// eslint-disable-next-line no-shadow\nexport enum Ease {\n EaseLinear = 'linear',\n Ease = 'ease',\n EaseIn = 'ease-in',\n EaseOut = 'ease-out',\n EaseInOut = 'ease-in-out',\n EaseInQuad = 'cubic-bezier(0.550, 0.085, 0.680, 0.530)',\n EaseOutQuad = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)',\n EaseInCubic = 'cubic-bezier(0.550, 0.055, 0.675, 0.190)',\n EaseOutCubic = 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',\n EaseInQuart = 'cubic-bezier(0.895, 0.030, 0.685, 0.220)',\n EaseOutQuart = 'cubic-bezier(0.165, 0.840, 0.440, 1.000)',\n EaseInQuint = 'cubic-bezier(0.755, 0.050, 0.855, 0.060)',\n EaseOutQuint = 'cubic-bezier(0.230, 1.000, 0.320, 1.000)',\n EaseInSine = 'cubic-bezier(0.470, 0.000, 0.745, 0.715)',\n EaseOutSine = 'cubic-bezier(0.390, 0.575, 0.565, 1.000)',\n EaseInExpo = 'cubic-bezier(0.950, 0.050, 0.795, 0.035)',\n EaseOutExpo = 'cubic-bezier(0.190, 1.000, 0.220, 1.000)',\n EaseInCirc = 'cubic-bezier(0.600, 0.040, 0.980, 0.335)',\n EaseOutCirc = 'cubic-bezier(0.075, 0.820, 0.165, 1.000)',\n EaseInBack = 'cubic-bezier(0.600, -0.280, 0.735, 0.045)',\n EaseOutBack = 'cubic-bezier(0.175, 0.885, 0.320, 1.275)',\n EaseInOutQuad = 'cubic-bezier(0.455, 0.030, 0.515, 0.955)',\n EaseInOutCubic = 'cubic-bezier(0.645, 0.045, 0.355, 1.000)',\n EaseInOutQuart = 'cubic-bezier(0.770, 0.000, 0.175, 1.000)',\n EaseInOutQuint = 'cubic-bezier(0.860, 0.000, 0.070, 1.000)',\n EaseInOutSine = 'cubic-bezier(0.445, 0.050, 0.550, 0.950)',\n EaseInOutExpo = 'cubic-bezier(1.000, 0.000, 0.000, 1.000)',\n EaseInOutCirc = 'cubic-bezier(0.785, 0.135, 0.150, 0.860)',\n EaseInOutBack = 'cubic-bezier(0.680, -0.550, 0.265, 1.550)',\n}\n","// eslint-disable-next-line no-shadow\nexport enum TransitionDuration {\n Fast = '100ms',\n Normal = '200ms',\n Slow = '300ms',\n}\n\n// eslint-disable-next-line no-shadow\nexport enum FontWeight {\n Normal = 400,\n Bold = 700,\n}\n\n// eslint-disable-next-line no-shadow\nexport enum FontSize {\n Normal = '16px',\n Large = '24px',\n}\n\n// eslint-disable-next-line no-shadow\nexport enum FontFamily {\n SouthWestSans = 'south-west-sans, sans-serif',\n Arial = 'Arial, Helvetica, sans-serif',\n}\n","export const pseudo = (display = 'block', position = 'absolute', content = ''): string => `\n content: '${content}';\n display: ${display};\n position: ${position};\n`;\n","export const hover = (content: string): string => `\n @media (hover: hover) {\n &:hover {\n ${content};\n }\n }\n`;\n","// eslint-disable-next-line no-shadow\nexport enum HeadingType {\n H1 = 'h1',\n}\n","import type { ReactNode, ComponentType } from 'react';\n\nexport type TypographyTypes = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardedAs?: string | ComponentType<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n as?: string | ComponentType<any>;\n children: ReactNode;\n};\n\n// eslint-disable-next-line no-shadow\nexport enum ParagraphType {\n Intro = 'intro',\n Large = 'large',\n Normal = 'normal',\n Small = 'small',\n CallToAction = 'call-to-action',\n}\n","import { css, FlattenSimpleInterpolation } from 'styled-components';\nimport { HeadingType } from '../components/atoms/Heading/Heading.data';\nimport { ParagraphType } from '../components/atoms/Paragraph/Paragraph.data';\nimport { FontWeight } from './variables';\n\ntype TypeStyles = ParagraphType | HeadingType;\n\nexport const typeStyle: Record<TypeStyles, FlattenSimpleInterpolation> = {\n [HeadingType.H1]: css`\n font-size: 24px;\n line-height: 1.25;\n font-weight: ${FontWeight.Bold};\n `,\n [ParagraphType.Intro]: css`\n font-size: 18px;\n line-height: 1.333;\n font-weight: ${FontWeight.Normal};\n `,\n [ParagraphType.CallToAction]: css`\n font-size: 16px;\n line-height: 1.125;\n font-weight: ${FontWeight.Bold};\n `,\n [ParagraphType.Large]: css`\n font-size: 16px;\n line-height: 1.125;\n font-weight: ${FontWeight.Normal};\n `,\n [ParagraphType.Normal]: css`\n font-size: 14px;\n line-height: 1.142;\n font-weight: ${FontWeight.Normal};\n `,\n [ParagraphType.Small]: css`\n font-size: 12px;\n line-height: 1.1666;\n font-weight: ${FontWeight.Normal};\n `,\n} as const;\n\nexport type TypeStyleType = typeof typeStyle;\n","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgAirplane(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19.52,13.93c2.77,0,3.8-1,4.16-1.36,0,0,.32-.31.32-.57a1.09,1.09,0,0,0-.32-.58c-.36-.33-1.39-1.35-4.16-1.35H14.9L9.45.74A1,1,0,0,0,8.67.26H6.72L9.6,10.07H7.92a18.23,18.23,0,0,0-3.18.32L2.83,7.87A1.2,1.2,0,0,0,2,7.37H0l1.43,3.75a2.69,2.69,0,0,0-1.32.82h0a.07.07,0,0,0,0,.06s0,0,0,.06h0a2.84,2.84,0,0,0,1.32.83L0,16.63H2a1.19,1.19,0,0,0,.88-.51h0l1.91-2.51a20.39,20.39,0,0,0,3.18.32h1.7L6.71,23.74h2a1,1,0,0,0,.78-.48l5.45-9.33h4.62Z\",\n fill: \"currentColor\",\n fillRule: \"evenodd\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgAirplane);\nexport default __webpack_public_path__ + \"static/media/airplane.4e72da2a.svg\";\nexport { ForwardRef as ReactComponent };","const map = [\n 'null',\n 'default',\n 'map-navigation',\n 'clustered-marker',\n 'active-marker',\n 'map-overlay',\n 'overlay',\n] as const;\n\nexport const zIndex = (name: (typeof map)[number]): number =>\n map.findIndex((itemName) => itemName === name);\n","/* eslint-disable max-lines */\nimport styled from 'styled-components';\nimport { rgba, size } from 'polished';\nimport { Marker, NavigationControl } from 'react-map-gl';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\nimport { pseudo } from '../../../styles/helpers/pseudo';\nimport { hover } from '../../../styles/helpers/hover';\nimport { Ease } from '../../../styles/easing';\nimport { FontSize, FontWeight, TransitionDuration } from '../../../styles/variables';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport { zIndex } from '../../../styles/zIndex';\n\nexport const StyledMapContainer = styled.div`\n ${size('55vh', '100%')};\n position: relative;\n\n @media ${respondTo(MediaQuery.Small)} {\n height: 65vh;\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n height: 100vh;\n }\n`;\n\nexport const StyledMarker = styled(Marker)<{\n $isActive?: boolean;\n $isPopulair?: boolean;\n $isCluster?: boolean;\n}>`\n ${size('0')};\n\n ${({ $isPopulair }) =>\n $isPopulair &&\n `\n z-index: ${zIndex('default')};\n `}\n\n ${({ $isCluster }) =>\n $isCluster &&\n `\n z-index: ${zIndex('clustered-marker')};\n `}\n\n ${({ $isActive }) =>\n $isActive &&\n `\n z-index: ${zIndex('active-marker')};\n `}\n\n ${hover(`\n z-index: ${zIndex('clustered-marker')};\n @media ${respondTo(MediaQuery.Medium)} {\n z-index: ${zIndex('map-overlay')};\n }\n `)};\n`;\n\ntype StyledAirportNameProps = {\n $isActive?: boolean;\n $isSuspended?: boolean;\n $isInSeasonalService?: boolean;\n $isConnected?: boolean;\n $isCluster?: boolean;\n $pointCount?: number;\n $isUnserved?: boolean;\n $nonStopOnly?: boolean;\n};\n\n// location-label\nexport const StyledLocationName = styled(AbstractButton)<StyledAirportNameProps>`\n ${typeStyle.normal};\n position: absolute;\n top: -0.9375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1.875rem;\n padding: 0 0.4375rem;\n background-color: ${({ theme }) => theme.color.white};\n color: ${({ theme }) => theme.color.black};\n transform: translate(-50%, -100%);\n white-space: nowrap;\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n\n cursor: pointer;\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n span {\n margin-left: 0.625rem;\n }\n\n &::before {\n ${pseudo()};\n ${size('0.4375rem')};\n bottom: -0.1875rem;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.xSmall};\n background-color: ${({ theme }) => theme.color.white};\n transform: rotate(45deg);\n }\n\n &::after {\n ${pseudo()};\n ${size('0.625rem')};\n bottom: -1.5625rem;\n left: 50%;\n border-radius: 50%;\n background-color: ${({ theme }) => theme.color.blue};\n transform: translate(-50%, -50%);\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n }\n\n &.marker-is-disabled {\n cursor: not-allowed;\n color: ${({ theme }) => theme.color.grey};\n\n &::after {\n border: transparent;\n background-color: ${({ theme, $isSuspended }) =>\n $isSuspended ? theme.color.orange : theme.color.lighterGrey};\n }\n\n ${hover(`\n transform: translate(-50%, -100%);\n\n &::after, svg {\n transform: translate(-50%, -50%);\n }\n `)}\n }\n\n ${({ $isActive, theme }) =>\n $isActive &&\n `\n top: -0.9375rem;\n background-color: ${theme.color.blue};\n color: ${theme.color.white};\n\n &::before {\n background-color: ${theme.color.blue};\n }\n\n &::after {\n height: 0.9375rem;\n width: 0.9375rem;\n bottom: -1.875rem;\n }\n `}\n\n ${({ $isConnected, theme }) =>\n $isConnected &&\n `\n &::after {\n border: 2px solid ${theme.color.blue};\n background-color: transparent;\n }\n `}\n\n ${({ $isSuspended, theme }) =>\n $isSuspended &&\n `\n cursor: not-allowed;\n\n &::after {\n height: 0.5625rem;\n width: 0.5625rem;\n transform: translate(-50%, -50%) rotate(45deg);\n border-radius: ${theme.defaultCssProps.borderRadius.xSmall};\n background-color: ${theme.color.orange};\n }\n `}\n\n ${({ $isInSeasonalService, theme }) =>\n $isInSeasonalService &&\n `\n svg {\n height: 1.25rem;\n width: 1.25rem;\n color: ${theme.color.darkerGrey};\n position: absolute;\n bottom: -2.25rem;\n left: 50%;\n transform: translate(-50%, -50%);\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n }\n\n &::after {\n content: none;\n }\n `}\n\n ${({ $isSuspended, $isInSeasonalService }) =>\n !$isSuspended &&\n !$isInSeasonalService &&\n `\n ${hover(`\n transform: translate(-50%, calc(-100% + -0.3125rem));\n\n &::after, svg {\n transform: translate(-50%, calc(-50% + 0.3125rem)) scale(1.1);\n }\n `)}\n `}\n\n ${({ $isActive }) =>\n $isActive &&\n `\n // transform: none;\n\n ${hover(`\n // transform: translate(0,calc(-0.3125rem));\n // transform: none;\n `)}\n `}\n\n\n ${({ $isCluster, theme }) =>\n $isCluster &&\n `\n margin-top: 1.875rem;\n background-color: ${theme.color.clusterBlue};\n border-radius: 50%;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: none;\n }\n `}\n\n ${({ $isCluster, $isConnected, theme }) =>\n $isCluster &&\n $isConnected &&\n `\n border: 2px solid ${theme.color.blue};\n background-color: ${theme.color.white};\n `}\n\n ${({ $isCluster, $isUnserved, $isConnected, theme }) =>\n $isCluster &&\n $isUnserved &&\n !$isConnected &&\n `\n cursor: not-allowed;\n background-color: ${theme.color.lighterGrey};\n border: transparent;\n\n &::before {\n background-color: ${theme.color.lighterGrey};\n }\n &::after {\n border: transparent;\n background-color: ${theme.color.lighterGrey};\n }\n\n ${hover(`\n transform: translate(-50%, -100%);\n\n &::after, svg {\n transform: translate(-50%, -50%);\n }\n `)}\n `}\n\n ${({ $isCluster, $nonStopOnly, $isConnected, theme }) =>\n $isCluster &&\n $nonStopOnly &&\n $isConnected &&\n `\n cursor: not-allowed;\n background-color: ${theme.color.lighterGrey};\n border: transparent;\n\n &::before {\n background-color: ${theme.color.lighterGrey};\n }\n &::after {\n border: transparent;\n background-color: ${theme.color.lighterGrey};\n }\n\n ${hover(`\n transform: translate(-50%, -100%);\n\n &::after, svg {\n transform: translate(-50%, -50%);\n }\n `)}\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 2 &&\n `\n width: 1rem;\n height: 1rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 2rem;\n height: 2rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 3 &&\n `\n width: 1.125rem;\n height: 1.125rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 2.3125rem;\n height: 2.3125rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 4 &&\n `\n width: 1.25rem;\n height: 1.25rem;\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 2.625rem;\n height: 2.625rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 5 &&\n `\n width: 1.375rem;\n height: 1.375rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 2.9375rem;\n height: 2.9375rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 6 &&\n `\n width: 1.5rem;\n height: 1.5rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 3.25rem;\n height: 3.25rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 7 &&\n `\n width: 1.625rem;\n height: 1.625rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 3.5625rem;\n height: 3.5625rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 8 &&\n `\n width: 1.75rem;\n height: 1.75rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 3.875rem;\n height: 3.875rem;\n }\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 9 &&\n `\n width: 1.875rem;\n height: 1.875rem;\n `}\n\n ${({ $isCluster, $pointCount }) =>\n $isCluster &&\n $pointCount === 10 &&\n `\n width: 2rem;\n height: 2rem;\n `}\n\n ${({ $isCluster }) =>\n !$isCluster &&\n `\n @media ${respondTo(MediaQuery.Medium)} {\n height: 2.5rem;\n padding: 0 1.25rem;\n\n &::before {\n ${size('0.625rem')};\n bottom: -0.1875rem;\n }\n `}\n`;\n\nexport const StyledClusterNumber = styled.div<{\n $isNumber?: boolean;\n $isConnected?: boolean;\n $isUnserved?: boolean;\n $isNonstop?: boolean;\n $nonStopOnly?: boolean;\n}>`\n font-size: 14px;\n font-weight: ${FontWeight.Bold};\n color: ${({ theme }) => theme.color.white};\n\n span {\n ${typeStyle.normal};\n position: absolute;\n top: -0.5313rem;\n margin-left: 0.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1.875rem;\n padding: 1.2188rem;\n background-color: ${({ theme }) => theme.color.white};\n color: ${({ theme }) => theme.color.black};\n transform: translate(-50%, -100%);\n white-space: nowrap;\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n\n cursor: pointer;\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n &::before {\n ${pseudo()};\n ${size('0.4375rem')};\n bottom: -0.1875rem;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.xSmall};\n background-color: ${({ theme }) => theme.color.white};\n transform: rotate(45deg);\n }\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n font-size: ${FontSize.Large};\n }\n\n ${({ $isNumber }) =>\n !$isNumber &&\n `\n margin-right: 0.75rem;\n `}\n\n ${({ $isConnected, theme }) =>\n $isConnected &&\n `\n color: ${theme.color.blue};\n `}\n ${({ $isUnserved, $isConnected, $isNonstop, theme }) =>\n $isUnserved &&\n !$isConnected &&\n !$isNonstop &&\n `\n cursor: not-allowed;\n color: ${theme.color.blue};\n\n &::before {\n cursor: not-allowed;\n border: transparent;\n background-color: ${theme.color.lighterGrey};\n }\n `}\n ${({ $isNonstop, $nonStopOnly, theme }) =>\n $nonStopOnly &&\n !$isNonstop &&\n `\n cursor: not-allowed;\n color: ${theme.color.blue};\n\n &::before {\n cursor: not-allowed;\n border: transparent;\n background-color: ${theme.color.lighterGrey};\n }\n `}\n`;\n\nexport const StyledLocationDot = styled.div<{\n $unavailable?: boolean;\n $isSuspended: boolean;\n $isInSeasonalService: boolean;\n $isUnserved?: boolean;\n $isConnected?: boolean;\n}>`\n ${size('0.625rem')};\n position: relative;\n cursor: pointer;\n border-radius: 50%;\n background-color: ${({ theme, $unavailable }) =>\n $unavailable ? theme.color.grey : theme.color.blue};\n transform: translate(-50%, -50%);\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n &::after {\n ${pseudo()};\n ${size('1.6875rem')};\n cursor: pointer;\n right: -80%;\n bottom: -80%;\n border-radius: 50%;\n border-style: solid;\n border-color: transparent;\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n &::after {\n visibility: hidden;\n }\n }\n\n ${({ $unavailable }) =>\n $unavailable &&\n `\n cursor: not-allowed;\n `}\n ${({ $isSuspended, theme }) =>\n $isSuspended &&\n `\n cursor: not-allowed;\n height: 0.5625rem;\n width: 0.5625rem;\n transform: translate(-50%, -50%) rotate(45deg);\n border-radius: ${theme.defaultCssProps.borderRadius.xSmall};\n background-color: ${theme.color.orange};\n\n &::after {\n ${pseudo()};\n ${size('1.6875rem')};\n cursor: pointer;\n left: -60%;\n bottom: -60%;\n border-radius: 50%;\n border-style: solid;\n border-color: transparent;\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n &::after {\n visibility: hidden;\n }\n }\n `}\n\n ${({ $isInSeasonalService, theme }) =>\n $isInSeasonalService &&\n `\n background-color: transparent;\n cursor: not-allowed;\n\n svg {\n height: 1.25rem;\n width: 1.25rem;\n color: ${theme.color.darkerGrey};\n position: absolute;\n bottom: 0;\n left: 0;\n transform: translate(-50%, -50%);\n }\n\n &::after {\n ${pseudo()};\n ${size('1.6875rem')};\n cursor: pointer;\n left: -60%;\n bottom: -60%;\n border-radius: 50%;\n border-style: solid;\n border-color: transparent;\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n &::after {\n visibility: hidden;\n }\n }\n `}\n\n ${({ $isSuspended, $isInSeasonalService }) =>\n !$isSuspended &&\n !$isInSeasonalService &&\n `\n ${hover(`\n transform: translate(-50%, -50%) scale(1.1);\n `)}\n `}\n\n ${({ $isConnected, theme }) =>\n $isConnected &&\n `\n border: 2px solid ${theme.color.blue};\n background-color: transparent;\n\n &::after {\n ${pseudo()};\n ${size('1.6875rem')};\n cursor: pointer;\n right: -160%;\n bottom: -160%;\n border-radius: 50%;\n border-style: solid;\n border-color: transparent;\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n &::after {\n visibility: hidden;\n }\n }\n `}\n\n ${({ $isUnserved, $isConnected, theme }) =>\n $isUnserved &&\n $isConnected &&\n `\n cursor: not-allowed;\n border: transparent;\n background-color: ${theme.color.lighterGrey};\n\n &::after {\n ${pseudo()};\n ${size('1.6875rem')};\n cursor: pointer;\n left: -80%;\n top: -80%;\n border-radius: 50%;\n border-style: solid;\n border-color: transparent;\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n &::after {\n visibility: hidden;\n }\n }\n\n\n `}\n`;\n\nexport const StyledNavigationControl = styled(NavigationControl)`\n right: 1.25rem;\n bottom: 1.25rem;\n z-index: ${zIndex('map-overlay')};\n\n button.mapboxgl-ctrl-icon {\n ${size('2.5rem')};\n display: flex;\n justify-content: center;\n align-items: center;\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n span.mapboxgl-ctrl-icon {\n ${size('2px', '0.75rem')};\n position: relative;\n background-color: ${({ theme }) => theme.color.white};\n background-image: none;\n }\n\n &.mapboxgl-ctrl-zoom-in {\n span::after {\n ${pseudo()};\n ${size('100%')};\n transform: rotate(90deg);\n background-color: ${({ theme }) => theme.color.white};\n }\n }\n\n &:last-child {\n border-top: 0;\n }\n\n ${hover(`\n transform: scale(1.1);\n `)}\n\n &:focus {\n transform: scale(1.06);\n border: 1px solid ${({ theme }) => theme.color.blue};\n z-index: 1;\n box-shadow: 0px 0px 4px ${({ theme }) => theme.color.blue};\n }\n }\n\n .mapboxgl-ctrl-group {\n width: 2.5rem;\n height: 5.0625rem;\n background-color: ${({ theme }) => theme.color.lightBlack};\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.small};\n\n &::after {\n ${pseudo()};\n ${size('1px', '100%')};\n top: 2.5rem;\n background-color: ${({ theme }) => rgba(theme.color.lightGrey, 0.3)};\n }\n\n &:not(:empty) {\n box-shadow: 0 0 1.25rem rgba(48, 76, 178, 0.05);\n }\n }\n`;\n\nexport const StyledGlobeButton = styled(AbstractButton)`\n ${size('2.5rem')};\n position: absolute;\n bottom: 0.625rem;\n right: 5.625rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.small};\n color: ${({ theme }) => theme.color.white};\n background-color: ${({ theme }) => theme.color.lightBlack};\n z-index: ${zIndex('active-marker')};\n cursor: pointer;\n transition: box-shadow ${TransitionDuration.Slow} ${Ease.EaseOut},\n transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n svg {\n ${size('1rem')};\n }\n\n ${hover(`\n transform: scale(1.03);\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n `)}\n\n &:focus {\n transform: scale(1.06);\n border: 1px solid ${({ theme }) => theme.color.blue};\n box-shadow: 0px 0px 4px ${({ theme }) => theme.color.blue};\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n bottom: 1.25rem;\n right: 4.375rem;\n z-index: ${zIndex('map-overlay')};\n }\n`;\n\n// fareComponent\nexport const StyleLocationContainerWithFare = styled.div<StyledAirportNameProps>`\n ${typeStyle.normal};\n position: absolute;\n top: -1.4063rem;\n // display: flex;\n align-items: center;\n justify-content: center;\n height: 1.875rem;\n background-color: ${({ theme }) => theme.color.white};\n color: ${({ theme }) => theme.color.black};\n transform: translate(-50%, -100%);\n white-space: nowrap;\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n\n cursor: pointer;\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n #routeFare {\n padding: 0.625rem 1.25rem;\n display: table;\n min-height: 52px;\n // top: -3.4375rem !important;\n padding: 0.3125rem 1.25rem;\n min-height: 42px;\n font-family: 'SouthwestSans-Regular';\n }\n #routeFare,\n button {\n position: relative;\n width: 100%;\n text-align: center;\n transform: none;\n top: -2.9688rem;\n }\n button {\n ::after {\n // display: none;\n }\n\n &:hover {\n transform: none;\n }\n }\n\n span {\n margin-left: 0.625rem;\n }\n\n &::before {\n ${pseudo()};\n ${size('0.4375rem')};\n bottom: -0.1875rem;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.xSmall};\n background-color: ${({ theme }) => theme.color.white};\n transform: rotate(45deg);\n }\n\n // &::after {\n // ${pseudo()};\n // ${size('0.625rem')};\n // bottom: -1.5625rem;\n // left: 50%;\n // border-radius: 50%;\n // background-color: ${({ theme }) => theme.color.blue};\n // transform: translate(-50%, -50%);\n // transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n // }\n\n &:hover {\n transform: translate(-50%, calc(-100% + -0.3125rem));\n\n button::after,\n svg {\n transform: translate(-50%, calc(-50% + 0.3125rem)) scale(1.1);\n }\n }\n\n &.marker-is-disabled {\n cursor: not-allowed;\n color: ${({ theme }) => theme.color.grey};\n\n &::after {\n border: transparent;\n background-color: ${({ theme, $isSuspended }) =>\n $isSuspended ? theme.color.orange : theme.color.lighterGrey};\n }\n\n ${hover(`\n transform: translate(-50%, -100%);\n\n &::after, svg {\n transform: translate(-50%, -50%);\n }\n `)}\n }\n`;\n","import { createContext, Dispatch, SetStateAction } from 'react';\nimport type { AnyProps, PointFeature } from 'supercluster';\nimport type { AirportType, FlightType, ViewportType } from './types';\n\nexport type ContextProps = {\n airportsData: Array<AirportType>;\n viewport: ViewportType;\n setViewport: Dispatch<SetStateAction<ViewportType>>;\n points: Array<PointFeature<AnyProps>>;\n setPoints: Dispatch<SetStateAction<Array<PointFeature<AnyProps>>>>;\n originAirport: AirportType | Record<string, never>;\n setOriginAirport: Dispatch<SetStateAction<AirportType | Record<string, never>>>;\n destinationAirport: AirportType | Record<string, never>;\n setDestinationAirport: Dispatch<SetStateAction<AirportType | Record<string, never>>>;\n flightType: FlightType;\n setFlightType: Dispatch<SetStateAction<FlightType>>;\n userLocation: GeolocationPosition | undefined;\n setUserLocation: Dispatch<SetStateAction<GeolocationPosition | undefined>>;\n userLocationError: boolean;\n setUserLocationError: Dispatch<SetStateAction<boolean>>;\n goToHawaii: boolean;\n setGoToHawaii: Dispatch<SetStateAction<boolean>>;\n isDesktop: boolean;\n mapboxKey: string;\n mapboxStyleUrl: string;\n mapFailed: boolean;\n setMapFailed: Dispatch<SetStateAction<boolean>>;\n nonstopChecked: boolean;\n setNonstopChecked: Dispatch<SetStateAction<boolean>>;\n showDisabledModal: boolean;\n setShowDisabledModal: Dispatch<SetStateAction<boolean>>;\n showDisabledModalConnection: boolean;\n setShowDisabledModalConnection: Dispatch<SetStateAction<boolean>>;\n hawaiiCount: Array<AirportType>;\n};\n\nconst AppContext = createContext<ContextProps>({} as ContextProps);\n\nexport default AppContext;\n","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgConstruction(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M23.71,3,21,5.7a.23.23,0,0,1-.17.07l-2.26-.08a.24.24,0,0,1-.23-.22l-.11-2.29A.24.24,0,0,1,18.3,3L21,.3A4.57,4.57,0,0,0,19.38,0a4.61,4.61,0,0,0-4.59,5.14.23.23,0,0,1-.07.19L5.28,14.77a.22.22,0,0,1-.19.06c-.23,0-.45,0-.67,0a4.12,4.12,0,0,0-3.11,1.37A4.93,4.93,0,0,0,.25,21.05L3,18.35a.21.21,0,0,1,.18-.07l2.29.11a.22.22,0,0,1,.22.22l.08,2.26a.26.26,0,0,1-.07.17L3,23.75a4.63,4.63,0,0,0,1.5.25,4.89,4.89,0,0,0,3.39-1.31,4.2,4.2,0,0,0,1.33-3.78.23.23,0,0,1,.07-.19l9.43-9.44a.26.26,0,0,1,.19-.07l.52,0a4.59,4.59,0,0,0,3.27-1.35A4.66,4.66,0,0,0,23.71,3Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgConstruction);\nexport default __webpack_public_path__ + \"static/media/construction.6ee5fe52.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgClose(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M14.42,12,23.5,2.93A1.72,1.72,0,0,0,21.07.5L12,9.58,2.93.5A1.72,1.72,0,0,0,.5,2.93L9.58,12,.5,21.07A1.72,1.72,0,0,0,2.93,23.5L12,14.42l9.07,9.08a1.73,1.73,0,0,0,2.43,0,1.72,1.72,0,0,0,0-2.43Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgClose);\nexport default __webpack_public_path__ + \"static/media/close.88bde51d.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgClock(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12,0A12,12,0,1,0,24,12,12,12,0,0,0,12,0Zm0,21.68A9.68,9.68,0,1,1,21.68,12,9.65,9.65,0,0,1,12,21.68Zm2.95-5a.56.56,0,0,0,.82-.15l.92-1.21a.56.56,0,0,0-.14-.82l-3.2-2.37V5.23a.62.62,0,0,0-.58-.58H11.23a.59.59,0,0,0-.58.58v8a.53.53,0,0,0,.19.44Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgClock);\nexport default __webpack_public_path__ + \"static/media/clock.65165e49.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgChecked(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6.91,20.87A2.74,2.74,0,0,1,5,20.08L.25,15.33a1.35,1.35,0,0,1,1.92-1.91l4.74,4.74L21.54,3.53a1.36,1.36,0,0,1,1.92,1.92L8.83,20.08A2.75,2.75,0,0,1,6.91,20.87Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgChecked);\nexport default __webpack_public_path__ + \"static/media/checked.2a8f8f41.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgChevronDown(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12,18.5a3.38,3.38,0,0,1-2.42-1L.5,8.42A1.71,1.71,0,0,1,2.93,6L12,15.07,21.07,6A1.71,1.71,0,0,1,23.5,8.42L14.42,17.5A3.38,3.38,0,0,1,12,18.5Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgChevronDown);\nexport default __webpack_public_path__ + \"static/media/chevron-down.c437c056.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgGlobe(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M16.28,7.35C15.6,3.05,13.91,0,12,0S8.44,3.05,7.72,7.35ZM7.38,12c0,1.11,0,2.13.14,3.1h9c.09-1,.14-2,.14-3.1s-.05-2.08-.14-3.1h-9C7.43,9.92,7.38,10.94,7.38,12ZM23.06,7.35A12,12,0,0,0,15.41.53a16.18,16.18,0,0,1,2.42,6.82ZM8.59.53A12,12,0,0,0,.94,7.35H6.17A16.18,16.18,0,0,1,8.59.53Zm15,8.37H18c.1,1,.2,2.08.2,3.1s-.1,2.08-.2,3.1h5.57A12.77,12.77,0,0,0,24,12,13.43,13.43,0,0,0,23.59,8.9ZM5.83,12c0-1,0-2.08.15-3.1H.41A13.43,13.43,0,0,0,0,12a12.77,12.77,0,0,0,.39,3.1H6C5.88,14.08,5.83,13.06,5.83,12Zm1.89,4.65C8.44,21,10.09,24,12,24s3.58-3,4.26-7.35Zm7.69,6.87a11.91,11.91,0,0,0,7.65-6.87H17.83A15.65,15.65,0,0,1,15.41,23.52ZM.94,16.65a11.91,11.91,0,0,0,7.65,6.87,16.17,16.17,0,0,1-2.42-6.87Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgGlobe);\nexport default __webpack_public_path__ + \"static/media/globe.a8573b43.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgInfo(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M15,3a3,3,0,1,1-3-3A3,3,0,0,1,15,3Zm0,4.6V21.1h1.8V24H7.2V21.1H9V10.6H7.2v-3Z\",\n fill: \"currentColor\",\n fillRule: \"evenodd\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgInfo);\nexport default __webpack_public_path__ + \"static/media/info.c40d57a8.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgList(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M2.25,2.25A2.25,2.25,0,0,0,0,4.5,2.22,2.22,0,0,0,2.25,6.75,2.25,2.25,0,0,0,4.5,4.5,2.28,2.28,0,0,0,2.25,2.25Zm0,7.5A2.25,2.25,0,0,0,0,12a2.22,2.22,0,0,0,2.25,2.25A2.25,2.25,0,0,0,4.5,12,2.28,2.28,0,0,0,2.25,9.75Zm0,7.5A2.25,2.25,0,0,0,0,19.5a2.22,2.22,0,0,0,2.25,2.25A2.25,2.25,0,0,0,4.5,19.5,2.28,2.28,0,0,0,2.25,17.25Zm21,.75h-15a.78.78,0,0,0-.75.75v1.5a.74.74,0,0,0,.75.75h15a.78.78,0,0,0,.75-.75v-1.5A.81.81,0,0,0,23.25,18Zm0-15h-15a.78.78,0,0,0-.75.75v1.5A.74.74,0,0,0,8.25,6h15A.78.78,0,0,0,24,5.25V3.75A.81.81,0,0,0,23.25,3Zm0,7.5h-15a.78.78,0,0,0-.75.75v1.5a.74.74,0,0,0,.75.75h15a.78.78,0,0,0,.75-.75v-1.5A.81.81,0,0,0,23.25,10.5Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgList);\nexport default __webpack_public_path__ + \"static/media/list.9cc0336c.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgLocationArrow(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20.84.16l-19.49,9a2.28,2.28,0,0,0,.89,4.36h8.24v8.24a2.28,2.28,0,0,0,4.36.89l9-19.49A2.35,2.35,0,0,0,20.84.16Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgLocationArrow);\nexport default __webpack_public_path__ + \"static/media/location-arrow.5770f999.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgPoint(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12,10.75a2.89,2.89,0,1,1,2.89-2.91A2.92,2.92,0,0,1,12,10.75ZM12,0A8,8,0,0,0,4,8a11.06,11.06,0,0,0,.86,4.07A43.61,43.61,0,0,0,12,24a44.75,44.75,0,0,0,7.08-11.67A10.92,10.92,0,0,0,20,8,8,8,0,0,0,12,0Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgPoint);\nexport default __webpack_public_path__ + \"static/media/point.d222d657.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgTrafficCone(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M13.18,0h-2.8L9.22,5.59h5.12ZM14.7,7.32H8.86l-.59,2.83h7Zm3.07,14.81h4.54V24H1.24V22.13H5.78L7.91,11.88h7.73Z\",\n fill: \"currentColor\",\n fillRule: \"evenodd\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgTrafficCone);\nexport default __webpack_public_path__ + \"static/media/traffic-cone.6caf19c5.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgUmbrella(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M24,13A12.08,12.08,0,0,0,13.36,3.41V2.66A1.38,1.38,0,0,0,12,1.32a1.34,1.34,0,0,0-1.33,1.34v.75A12.12,12.12,0,0,0,0,13c-.08.42.33.92.79.5C3,11.25,5.27,11.33,7.39,15.09a.47.47,0,0,0,.84,0C9.06,13.58,10.1,12,12,12c2.42,0,3.67,2.88,3.75,3.09a.47.47,0,0,0,.84,0c2.12-3.76,4.46-3.84,6.63-1.55C23.66,14,24.07,13.46,24,13Zm-13.3.88v5.42A.7.7,0,0,1,10,20a.74.74,0,0,1-.67-.42,1.29,1.29,0,0,0-1.67-.83,1.33,1.33,0,0,0-.83,1.71,3.36,3.36,0,0,0,6.51-1.13V13.92A2.14,2.14,0,0,0,12,13.33,2,2,0,0,0,10.69,13.92Z\",\n fill: \"currentColor\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgUmbrella);\nexport default __webpack_public_path__ + \"static/media/umbrella.258689e8.svg\";\nexport { ForwardRef as ReactComponent };","/* eslint-disable @typescript-eslint/naming-convention */\nimport { ReactComponent as Airplane } from './svg/airplane.svg';\nimport { ReactComponent as Construction } from './svg/construction.svg';\nimport { ReactComponent as Close } from './svg/close.svg';\nimport { ReactComponent as Clock } from './svg/clock.svg';\nimport { ReactComponent as Checkmark } from './svg/checked.svg';\nimport { ReactComponent as ChevronDown } from './svg/chevron-down.svg';\nimport { ReactComponent as Globe } from './svg/globe.svg';\nimport { ReactComponent as Info } from './svg/info.svg';\nimport { ReactComponent as List } from './svg/list.svg';\nimport { ReactComponent as LocationArrow } from './svg/location-arrow.svg';\nimport { ReactComponent as Point } from './svg/point.svg';\nimport { ReactComponent as TrafficCone } from './svg/traffic-cone.svg';\nimport { ReactComponent as Umbrella } from './svg/umbrella.svg';\n\nexport const Icon = {\n Airplane,\n Construction,\n Close,\n Clock,\n Checkmark,\n ChevronDown,\n TrafficCone,\n Info,\n List,\n LocationArrow,\n Point,\n Umbrella,\n Globe,\n};\n","import { useEffect, useState } from 'react';\nimport * as turf from '@turf/turf';\nimport * as projection from '@turf/projection';\nimport type { Feature, LineString, GeoJsonProperties } from 'geojson';\nimport type { AirportType } from '../utils/types';\n\ntype UseRouteLineProps = {\n originAirport: AirportType | Record<string, never>;\n destinationAirport: AirportType | Record<string, never>;\n};\n\nconst useRouteLine = ({ originAirport, destinationAirport }: UseRouteLineProps) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [curved, setCurved] = useState<Feature<LineString, GeoJsonProperties>>([] as any);\n useEffect(() => {\n setCurved([] as unknown as Feature<LineString, GeoJsonProperties>);\n if (originAirport.airport_name && destinationAirport.airport_name) {\n const start = projection.toWgs84([\n parseFloat(originAirport.longitude),\n parseFloat(originAirport.latitude),\n ]);\n const end = projection.toWgs84([\n parseFloat(destinationAirport.longitude),\n parseFloat(destinationAirport.latitude),\n ]);\n const distance = turf.distance(start, end);\n const midpoint = turf.midpoint(start, end);\n const bearing = turf.bearing(start, end) - 90;\n const destination = turf.destination(midpoint, distance, bearing);\n\n const curvedLine = turf.lineArc(\n destination,\n turf.distance(destination, start),\n turf.bearing(destination, end),\n turf.bearing(destination, start),\n { steps: 128 },\n );\n const mercatorCurvedLine = projection.toMercator(curvedLine);\n\n setCurved(mercatorCurvedLine);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [originAirport, destinationAirport]);\n\n return curved;\n};\n\nexport default useRouteLine;\n","import styled from 'styled-components';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport type { FontWeight } from '../../../styles/variables';\nimport type { ParagraphType } from './Paragraph.data';\n\nexport interface StyledParagraphProps {\n $type: ParagraphType;\n $fontWeight?: FontWeight;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const StyledParagraph = styled.p<StyledParagraphProps>`\n ${(props) => typeStyle[props.$type]};\n\n ${(props) => props.$fontWeight && `font-weight: ${props.$fontWeight}`};\n`;\n","import { ComponentType, forwardRef } from 'react';\nimport type { FontWeight } from '../../../styles/variables';\nimport { ParagraphType, TypographyTypes } from './Paragraph.data';\nimport { StyledParagraph } from './Paragraph.styles';\n\nexport { ParagraphType } from './Paragraph.data';\n\nexport interface ParagraphProps extends TypographyTypes {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardedAs?: string | ComponentType<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n as?: string | ComponentType<any>;\n id?: string;\n type?: ParagraphType;\n fontWeight?: FontWeight;\n}\n\nexport const Paragraph = forwardRef<HTMLParagraphElement, ParagraphProps>(\n (\n { forwardedAs, as = forwardedAs || 'p', type = ParagraphType.Normal, fontWeight, ...props },\n ref,\n ) => <StyledParagraph id=\"\" ref={ref} as={as} $type={type} $fontWeight={fontWeight} {...props} />,\n);\n\nexport const ParagraphId = forwardRef<HTMLParagraphElement, ParagraphProps>(\n (\n { forwardedAs, as = forwardedAs || 'p', type = ParagraphType.Normal, fontWeight, ...props },\n ref,\n ) => (\n <StyledParagraph\n id=\"navigation-flight-type\"\n ref={ref}\n as={as}\n $type={type}\n $fontWeight={fontWeight}\n {...props}\n />\n ),\n);\n","import styled from 'styled-components';\nimport { size } from 'polished';\nimport { motion } from 'framer-motion';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\nimport { pseudo } from '../../../styles/helpers/pseudo';\nimport { hover } from '../../../styles/helpers/hover';\nimport { Ease } from '../../../styles/easing';\nimport { FontWeight, TransitionDuration } from '../../../styles/variables';\nimport { Paragraph } from '../../atoms/Paragraph/Paragraph';\nimport { zIndex } from '../../../styles/zIndex';\nimport { typeStyle } from '../../../styles/typeStyle';\n\nexport const StyledInformationWrapper = styled(motion.div)<{\n $isFocussed: boolean;\n $isOpen: boolean;\n $isTablet: boolean;\n $hasMessage: boolean;\n}>`\n position: absolute;\n overflow: hidden;\n background-color: ${({ theme }) => theme.color.white};\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.small};\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n z-index: ${zIndex('map-overlay')};\n top: 1.25rem;\n left: 1.25rem;\n width: auto;\n height: 2.5rem;\n ${({ $isOpen, $isTablet }) =>\n !$isOpen &&\n $isTablet &&\n `\n top: 1.25rem;\n left: 1.25rem;\n width: auto;\n height: 2.5rem;\n\n ${hover(`\n transform: scale(1.03);\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n\n `)}\n `}\n ${({ $isOpen, $isTablet }) =>\n $isOpen &&\n $isTablet &&\n `\n top: 0.625rem;\n left: 0.625rem;\n width: 16.25rem;\n height: auto;\n padding: 0.625rem;\n `}\n ${({ $isOpen, $isTablet }) =>\n $isOpen &&\n !$isTablet &&\n `\n top: 0rem;\n left: 0rem;\n width: 100vw;\n height: auto;\n padding: 1.25rem;\n `}\n ${({ $hasMessage, $isOpen }) =>\n !$hasMessage &&\n !$isOpen &&\n `\n margin-right: 0.625rem;\n width: 2.5rem;\n `}\n ${({ $isFocussed, theme }) =>\n $isFocussed &&\n `\n border: 1px solid ${theme.color.blue};\n box-shadow: 0px 0px 4px ${theme.color.blue};\n `}\n`;\n\nexport const StyledInformationButton = styled(motion.button)<{\n $isOpen: boolean;\n $hasMessage: boolean;\n}>`\n ${size('2.5rem', '100%')};\n ${typeStyle.normal};\n font-weight: ${FontWeight.Bold};\n position: relative;\n cursor: pointer;\n display: flex;\n align-items: center;\n padding-left: 2.5rem;\n color: ${({ theme }) => theme.color.white};\n background-color: ${({ theme }) => theme.color.lightBlack};\n ${({ $hasMessage }) =>\n $hasMessage &&\n `\n margin-right: 0.625rem;\n `}\n &::before {\n ${pseudo()};\n ${size('1.625rem')};\n top: 0.4375rem;\n left: 0.4375rem;\n border-radius: 50%;\n background-color: ${({ theme }) => theme.color.white};\n transition: ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n ${({ $isOpen, theme }) =>\n $isOpen &&\n `\n background-color: ${theme.color.lightBlack};\n transform: background-color ${TransitionDuration.Slow};\n `}\n }\n svg {\n ${size('0.875rem')};\n position: absolute;\n left: 0.8125rem;\n transition: ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n color: ${({ theme }) => theme.color.lightBlack};\n ${({ $isOpen, theme }) =>\n $isOpen &&\n `\n color: ${theme.color.white};\n transform: color ${TransitionDuration.Slow};\n `}\n }\n\n ${({ $isOpen, theme }) =>\n $isOpen &&\n `\n color: ${theme.color.lightBlack};\n background-color: ${theme.color.white};\n transform: background-color color ${TransitionDuration.Slow};\n `}\n`;\n\nexport const StyledInformationLegend = styled.span`\n cursor: default;\n display: flex;\n margin-left: 3.125rem;\n align-items: center;\n justify-content: center;\n position: absolute;\n transform: translateY(-175%);\n color: ${({ theme }) => theme.color.darkerGrey};\n`;\n\nexport const StyledCloseButton = styled(AbstractButton)`\n ${size('2.1875rem')};\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 1.375rem;\n left: calc(100vw - 0.625rem);\n transform: translateX(-100%);\n color: ${({ theme }) => theme.color.blue};\n cursor: pointer;\n\n svg {\n ${size('0.875rem')};\n }\n\n &:focus {\n transform: translateX(-100%) scale(1.08);\n border: 1px solid ${({ theme }) => theme.color.blue};\n box-shadow: 0 0 4px ${({ theme }) => theme.color.blue};\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n top: 0.875rem;\n left: calc(16.25rem - 0.625rem);\n }\n`;\n\nexport const StyledInformationContent = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 0.4375rem;\n pointer-events: none;\n`;\n\nexport const StyledInformationBlock = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-bottom: 1.375rem;\n color: ${({ theme }) => theme.color.blue};\n\n svg {\n ${size('1.75rem')};\n position: relative;\n border: 4px solid ${({ theme }) => theme.color.white};\n }\n`;\n\nexport const StyledIcon = styled.img`\n ${size('1.75rem')};\n position: relative;\n border: 4px solid ${({ theme }) => theme.color.white};\n`;\n\nexport const StyledInformationDescription = styled(Paragraph)`\n color: ${({ theme }) => theme.color.darkerGrey};\n margin-bottom: 0.4375rem;\n`;\n\nexport const StyledFlightInformation = styled.span<{ $connected?: boolean }>`\n ${size('2px', '8.25rem')};\n position: absolute;\n bottom: 0.8125rem;\n background: ${({ theme }) => theme.color.blue};\n\n &::before,\n &::after {\n ${pseudo()};\n ${size('0.5rem')};\n top: 0.0625rem;\n border-radius: 50%;\n background: ${({ theme }) => theme.color.blue};\n }\n\n &::before {\n left: -0.125rem;\n transform: translate(-100%, -50%);\n }\n\n &::after {\n right: -0.125rem;\n transform: translate(100%, -50%);\n }\n\n ${({ $connected, theme }) =>\n $connected &&\n `\n background: transparent;\n background-image: linear-gradient(to right, ${theme.color.blue} 60%, rgba(255,255,255,0) 0%);\n background-position: right;\n background-size: 12px 2px;\n background-repeat: repeat-x;\n `}\n`;\n","import { ReactElement, useRef, useState } from 'react';\nimport { useEvent, useMedia } from 'react-use';\nimport { FormattedMessage } from 'react-intl';\nimport {\n StyledInformationContent,\n StyledInformationWrapper,\n StyledInformationButton,\n StyledIcon,\n StyledCloseButton,\n StyledInformationBlock,\n StyledInformationDescription,\n StyledFlightInformation,\n} from './InformationContent.styles';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { useExternalValue } from '../../../hooks/useExternalValue';\n\nexport function InformationContent(): ReactElement {\n const outsideData = useExternalValue('map-info-editable-items');\n const infoRef = useRef<HTMLDivElement>(null);\n const toggleButtonRef = useRef<HTMLButtonElement>(null);\n const [infoModalOpen, setInfoModalOpen] = useState(false);\n const isTablet = useMedia(MediaQuery.Medium);\n const id = 'map-info-legend';\n // eslint-disable-next-line no-restricted-properties\n const hasMessage = document.querySelector(`#${id}`)?.textContent !== ' ';\n const [isFocussed, setIsFocussed] = useState(false);\n const handleKeydown = (event: KeyboardEvent) => {\n if (infoModalOpen && event.key === 'Escape') {\n setInfoModalOpen(false);\n }\n };\n const handleModalToggle = () => {\n if (infoModalOpen) {\n setInfoModalOpen(false);\n } else {\n setInfoModalOpen(true);\n }\n setIsFocussed(false);\n };\n\n useEvent('keydown', (event) => handleKeydown(event as KeyboardEvent), document);\n\n useEvent(\n 'focus',\n () => {\n setIsFocussed(true);\n },\n toggleButtonRef.current,\n );\n\n useEvent(\n 'blur',\n () => {\n setIsFocussed(false);\n },\n toggleButtonRef.current,\n );\n return (\n <StyledInformationWrapper\n id=\"map-info-block\"\n ref={infoRef}\n $isFocussed={isFocussed}\n $isOpen={infoModalOpen}\n $isTablet={isTablet}\n $hasMessage={hasMessage}\n initial={false}\n layout\n >\n <StyledInformationButton\n aria-label={infoModalOpen ? 'close legend' : 'open legend'}\n ref={toggleButtonRef}\n onClick={() => handleModalToggle()}\n $isOpen={infoModalOpen}\n $hasMessage={hasMessage}\n layout=\"position\"\n >\n <Icon.Info />\n <FormattedMessage id={id} defaultMessage=\" \">\n {(message) => (message === id ? <></> : <span id={id}>{message}</span>)}\n </FormattedMessage>\n </StyledInformationButton>\n <StyledCloseButton\n aria-label=\"close legend\"\n disabled={!infoModalOpen}\n tabIndex={!infoModalOpen ? -1 : undefined}\n onClick={() => setInfoModalOpen(false)}\n >\n <Icon.Close />\n </StyledCloseButton>\n <StyledInformationContent>\n <StyledInformationBlock>\n <StyledInformationDescription id=\"map-info-nonstop-text\">\n <FormattedMessage\n id=\"map-info-nonstop-label\"\n description=\"information - Nonstop flight\"\n defaultMessage=\"Nonstop flight\"\n />\n </StyledInformationDescription>\n <StyledFlightInformation />\n <Icon.Airplane />\n </StyledInformationBlock>\n <StyledInformationBlock>\n <StyledInformationDescription id=\"map-info-connected-text\">\n <FormattedMessage\n id=\"map-info-connected-label\"\n defaultMessage=\"Connecting flight\"\n description=\"information - Connecting flight\"\n />\n </StyledInformationDescription>\n <StyledFlightInformation $connected />\n <Icon.Airplane />\n </StyledInformationBlock>\n {outsideData &&\n outsideData.map((customMessage, index) => {\n return (\n <>\n <StyledInformationDescription id={`map-info-custom-${index}`}>\n <span id={`map-info-custom-${index}-label`}>{customMessage?.label}</span>\n </StyledInformationDescription>\n\n <StyledIcon src={customMessage?.icon} alt={customMessage?.label} />\n </>\n );\n })}\n </StyledInformationContent>\n </StyledInformationWrapper>\n );\n}\n","import { useEffect, useState } from 'react';\n\ntype ExternalValues = {\n showLabels?: boolean;\n showNumbers?: boolean;\n dragPan?: boolean;\n label?: string;\n icon?: string;\n};\n\nexport const useExternalValue = (keyword: string): Array<ExternalValues> | undefined => {\n const [items, setItems] = useState(undefined);\n useEffect(() => {\n if (keyword.length > 0) {\n (async () => {\n const response = await fetch('/configuration/variations.json');\n try {\n const data = await response.json();\n setItems(data[keyword]);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n })();\n }\n }, [keyword]);\n return items;\n};\n\nexport const useExternalBoolean = (keyword: string): boolean | undefined => {\n const [items, setItems] = useState(undefined);\n useEffect(() => {\n if (keyword.length > 0) {\n (async () => {\n const response = await fetch('/configuration/variations.json');\n try {\n const data = await response.json();\n if (data['map-cluster-numbers']) setItems(data['map-cluster-numbers'][keyword]);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n })();\n }\n }, [keyword]);\n return items;\n};\n\nexport const useExternalBooleanLabels = (keyword: string): boolean | undefined => {\n const [items, setItems] = useState(undefined);\n useEffect(() => {\n if (keyword.length > 0) {\n (async () => {\n const response = await fetch('/configuration/variations.json');\n try {\n const data = await response.json();\n if (data['map-cluster-label']) setItems(data['map-cluster-label'][keyword]);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n })();\n }\n }, [keyword]);\n return items;\n};\n\nexport const useExternalBooleanDragPan = (keyword: string): boolean | undefined => {\n const [items, setItems] = useState(undefined);\n useEffect(() => {\n if (keyword.length > 0) {\n (async () => {\n const response = await fetch('/configuration/variations.json');\n try {\n const data = await response.json();\n if (data['map-dragPan']) setItems(data['map-dragPan'][keyword]);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n })();\n }\n }, [keyword]);\n return items;\n};\n","import type { AirportType } from './types';\n\nexport const isUnserved = (\n origin: AirportType | Record<string, never>,\n destination: AirportType | Record<string, never>,\n): boolean => !!(origin.iata_code && origin.unserved.includes(destination.iata_code));\n\nexport const isConnected = (\n origin: AirportType | Record<string, never>,\n destination: AirportType | Record<string, never>,\n): boolean => !!(origin.iata_code && origin.connected.includes(destination.iata_code));\n\nexport const isNonstop = (\n origin: AirportType | Record<string, never>,\n destination: AirportType | Record<string, never>,\n): boolean => !!(origin.iata_code && origin.nonstop.includes(destination.iata_code));\n","export const color = {\n white: '#fff',\n black: '#1A1919',\n lightBlack: '#111B40',\n darkerGrey: '#565656',\n grey: '#8F8F8F',\n lightGrey: '#C4C4C4',\n lighterGrey: '#CCCCCC',\n blue: '#304CB2',\n darkerBlue: '#1C4486',\n clusterBlue: '#1a2c80',\n yellow: '#FFBF27',\n orange: '#ff792e',\n} as const;\n\nexport const defaultCssProps = {\n borderRadius: {\n xSmall: '0.0625rem',\n small: '0.125rem',\n normal: '0.25rem',\n },\n} as const;\n\n/* styled-components theme */\nexport const theme = {\n color,\n defaultCssProps,\n} as const;\n\nexport type ThemeType = typeof theme;\nexport type ColorType = ThemeType['color'][keyof ThemeType['color']];\n\n// Overwrite styled-components DefaultTheme\ndeclare module 'styled-components' {\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n export interface DefaultTheme extends ThemeType {}\n}\n","import { size } from 'polished';\nimport styled, { css } from 'styled-components';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { Ease } from '../../../styles/easing';\nimport { TransitionDuration } from '../../../styles/variables';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport { pseudo } from '../../../styles/helpers/pseudo';\n\ntype StyledButtonProps = {\n disabled?: boolean;\n};\n\nconst disabledCss = css`\n cursor: not-allowed;\n color: ${({ theme }) => theme.color.white};\n background-color: ${({ theme }) => theme.color.lighterGrey};\n`;\n\nexport const StyledButtonContent = styled.span`\n ${typeStyle['call-to-action']};\n position: relative;\n\n &::after {\n ${pseudo()};\n ${size('2px', '100%')};\n left: 0;\n bottom: -0.0625rem;\n opacity: 0;\n transform: translateY(0.0625rem) scaleX(80%);\n transition-duration: ${TransitionDuration.Normal};\n transition-property: transform, opacity;\n transition-timing-function: ${Ease.EaseOut};\n background-color: ${({ theme }) => theme.color.black};\n }\n`;\n\nexport const StyledButton = styled(AbstractButton)<StyledButtonProps>`\n height: 3.75rem;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n text-decoration: none;\n padding: 0 1.5rem;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.normal};\n color: ${({ theme }) => theme.color.black};\n background-color: ${({ theme }) => theme.color.yellow};\n transition-duration: ${TransitionDuration.Normal};\n transition-property: background-color, color;\n transition-timing-function: ${Ease.EaseOut};\n\n ${(props) => props.disabled && disabledCss};\n\n &:not(:disabled):hover,\n &:not(disabled):hover,\n &:not(:disabled):focus,\n &:not(disabled):focus ${StyledButtonContent} {\n &::after {\n opacity: ${({ disabled }) => (disabled ? '0' : '1')};\n transform: translateY(0) scaleX(100%);\n }\n }\n`;\n","import { noop } from 'lodash-es';\nimport { ComponentProps, forwardRef } from 'react';\nimport { StyledButton, StyledButtonContent } from './Button.styles';\n\nexport type ButtonProps = ComponentProps<'a'> &\n ComponentProps<'button'> & { enforceLink?: boolean };\n\nexport const Button = forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>(\n ({ onClick = noop, enforceLink = false, children, ...props }, ref) => {\n return (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n <StyledButton\n {...props}\n ref={ref}\n onClick={(event: { currentTarget: HTMLElement }) => {\n event.currentTarget.blur();\n onClick(event);\n }}\n enforceLink={enforceLink}\n >\n <StyledButtonContent>{children}</StyledButtonContent>\n </StyledButton>\n );\n },\n);\n","import styled from 'styled-components';\nimport { size } from 'polished';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { Button } from '../../molecules/Button/Button';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\n\nexport const StyledFallbackMap = styled.div`\n ${size('100%')};\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const StyledMessageWrapper = styled.div`\n width: calc(100% - 2.5rem);\n max-width: 40rem;\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: ${({ theme }) => theme.color.white};\n box-shadow: 0 4px 20px rgba(48, 76, 178, 0.2);\n text-align: center;\n padding: 1.875rem;\n\n strong {\n display: block;\n }\n\n @media ${respondTo(MediaQuery.XLarge)} {\n width: 100%;\n padding: 2.5rem;\n }\n`;\n\nexport const StyledClockIcon = styled(Icon.Clock)`\n ${size('2.625rem')};\n margin-bottom: 0.625rem;\n color: ${({ theme }) => theme.color.orange};\n`;\n\nexport const StyledButton = styled(Button)`\n margin-top: 1.875rem;\n`;\n","export default __webpack_public_path__ + \"static/media/fallback-map.54e879cb.jpg\";","import styled, { css } from 'styled-components';\nimport type { ImageProps } from './Image';\nimport { Ease } from '../../../styles/easing';\nimport { TransitionDuration } from '../../../styles/variables';\n\nconst coverCss = css`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n`;\n\nconst containCss = css`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n`;\n\nconst aspectRatioCss = css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n`;\n\nexport const StyledImage = styled.div<\n Partial<ImageProps> & {\n $cover?: boolean;\n $contain?: boolean;\n $roundedBorder?: boolean;\n $aspectRatio?: [number, number];\n }\n>`\n width: 100%;\n position: relative;\n height: auto;\n\n ${({ $cover }) => $cover && coverCss}\n ${({ $contain }) => $contain && containCss}\n`;\n\nexport const StyledPicture = styled.picture<{ $aspectRatio?: [number, number] }>`\n ${({ $aspectRatio }) => $aspectRatio && aspectRatioCss}\n`;\n\ntype StyledImageElementProps = {\n $cover?: boolean;\n $contain?: boolean;\n};\n\nexport const StyledImageElement = styled.img<StyledImageElementProps>`\n width: 100%;\n top: 0;\n left: 0;\n opacity: 0;\n transition: opacity ${TransitionDuration.Normal} ${Ease.EaseOut};\n\n &.lazyloaded {\n opacity: 1;\n }\n\n ${(props) => props.$cover && `position: absolute; height: 100%; object-fit: cover;`}\n ${(props) => props.$contain && `position: absolute; height: 100%; object-fit: contain;`}\n`;\n","import type { MediaQuery } from '../../../styles/mediaQuery';\nimport { StyledImage, StyledImageElement, StyledPicture } from './Image.styles';\n\nexport type AspectRatio = [number, number];\n\ntype ImageSource = {\n media: MediaQuery;\n srcset: string;\n aspectRatio?: AspectRatio;\n objectFit?: 'cover' | 'contained' | 'initial';\n};\n\nexport type ImageProps = {\n alt: string;\n src: string;\n width?: number;\n height?: number;\n preload?: boolean;\n cover?: boolean;\n contain?: boolean;\n roundedBorder?: boolean;\n source: ReadonlyArray<ImageSource>;\n aspectRatio?: AspectRatio;\n className?: string;\n};\n\nexport const Image = ({\n alt,\n src,\n width,\n height,\n aspectRatio,\n className,\n source,\n cover = false,\n contain = false,\n preload = false,\n roundedBorder = false,\n ...props\n}: ImageProps) => {\n return (\n <StyledImage\n {...props}\n source={source}\n $aspectRatio={aspectRatio}\n $cover={cover}\n $contain={contain}\n $roundedBorder={roundedBorder}\n className={className}\n >\n <StyledPicture $aspectRatio={aspectRatio}>\n {source.map(({ media, srcset }) => (\n <source key={srcset} media={media} data-srcset={srcset} />\n ))}\n <StyledImageElement\n $cover={cover}\n $contain={contain}\n data-srcset={src}\n className={preload ? 'lazyload lazypreload' : 'lazyload'}\n alt={alt}\n width={width}\n height={height}\n />\n </StyledPicture>\n </StyledImage>\n );\n};\n","import styled from 'styled-components';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport type { TypographyTypes } from '../Paragraph/Paragraph.data';\nimport type { HeadingType } from './Heading.data';\n\n/**\n * These types are available for the heading component. Keep in mind that by default the type also\n * defines the tag that is used to render out the component. So if you choose to use the type `h2`\n * it will also render out a `<h2>` tag.\n */\nexport interface StyledHeadingProps extends TypographyTypes {\n $type: HeadingType;\n}\n\nexport const StyledHeading = styled.h1<StyledHeadingProps>`\n ${(props) => typeStyle[props.$type]};\n margin-top: 0;\n margin-bottom: 0;\n`;\n","import React, { forwardRef, ReactNode } from 'react';\nimport type { HeadingType } from './Heading.data';\nimport { StyledHeading } from './Heading.styles';\n\nexport { HeadingType } from './Heading.data';\n\nexport type HeadingProps = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardedAs?: string | React.ComponentType<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n as?: string | React.ComponentType<any>;\n children: ReactNode;\n type?: HeadingType;\n};\n\nexport const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(function Heading(\n { forwardedAs, as = forwardedAs || 'h1', type = as, children, ...props },\n ref,\n) {\n return (\n <StyledHeading {...props} $type={type} as={as} ref={ref}>\n {children}\n </StyledHeading>\n );\n});\n","import styled from 'styled-components';\nimport { size } from 'polished';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport { zIndex } from '../../../styles/zIndex';\nimport { Ease } from '../../../styles/easing';\nimport { FontWeight, TransitionDuration } from '../../../styles/variables';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\nimport { hover } from '../../../styles/helpers/hover';\n\nexport const StyledListViewButton = styled(AbstractButton)`\n ${size('2.5rem')};\n position: absolute;\n bottom: 0.625rem;\n right: 2.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.small};\n color: ${({ theme }) => theme.color.white};\n background-color: ${({ theme }) => theme.color.lightBlack};\n z-index: ${zIndex('active-marker')};\n cursor: pointer;\n transition: box-shadow ${TransitionDuration.Slow} ${Ease.EaseOut},\n transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n svg {\n ${size('1rem')};\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n ${typeStyle.normal};\n font-weight: ${FontWeight.Bold};\n top: 1.25rem;\n right: 1.25rem;\n bottom: auto;\n width: auto;\n white-space: nowrap;\n flex-direction: row-reverse;\n padding: 0 0.6875rem;\n\n svg {\n margin-right: 0.625rem;\n }\n }\n\n ${hover(`\n transform: scale(1.03);\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n `)}\n\n &:focus {\n transform: scale(1.04);\n border: 1px solid ${({ theme }) => theme.color.blue};\n box-shadow: 0px 0px 4px ${({ theme }) => theme.color.blue};\n }\n`;\n","import type { ReactElement } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { useMedia } from 'react-use';\nimport { StyledListViewButton } from './ListViewButton.styles';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { MediaQuery } from '../../../styles/mediaQuery';\n\nexport function ListViewButton(): ReactElement {\n const isTablet = useMedia(MediaQuery.Medium);\n return (\n <StyledListViewButton\n aria-label=\"view list page\"\n id=\"list-view-button\"\n href=\"/route-map-list-view/?clk=RTMAPLIST\"\n enforceLink\n >\n {isTablet && (\n <FormattedMessage\n id=\"map-button-listview\"\n description=\"list view button\"\n defaultMessage=\"View List\"\n />\n )}\n <Icon.List />\n </StyledListViewButton>\n );\n}\n","import type { ReactElement } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport {\n StyledFallbackMap,\n StyledMessageWrapper,\n StyledClockIcon,\n StyledButton,\n} from './FallbackMap.styles';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport map from '../../../assets/images/fallback-map.jpg';\nimport { Image } from '../../atoms/Image/Image';\nimport { Heading, HeadingType } from '../../atoms/Heading/Heading';\nimport { ListViewButton } from '../../molecules/ListViewButton/ListViewButton';\n\nexport function FallbackMap(): ReactElement {\n return (\n <StyledFallbackMap>\n <Image\n alt=\"Fallback map background\"\n src={map}\n cover\n source={[\n {\n media: MediaQuery.Small,\n srcset: map,\n },\n ]}\n />\n <ListViewButton />\n <StyledMessageWrapper>\n <StyledClockIcon />\n <Heading type={HeadingType.H1}>\n <strong>\n <FormattedMessage\n id=\"map-fallback-heading\"\n description=\"fallback heading\"\n defaultMessage=\"Map is not responding\"\n />\n </strong>\n <FormattedMessage\n id=\"map-fallback-subheading\"\n description=\"fallback subheading\"\n defaultMessage=\"Please try again in 5 minutes\"\n />\n </Heading>\n <StyledButton\n onClick={() => {\n // eslint-disable-next-line no-restricted-globals\n location.reload();\n }}\n >\n <FormattedMessage\n id=\"map-fallback-button-reload\"\n description=\"reload button\"\n defaultMessage=\"Reload Map\"\n />\n </StyledButton>\n </StyledMessageWrapper>\n </StyledFallbackMap>\n );\n}\n","// TO DO LIST\r\n// 1. Map text values to Teamsite\r\n\r\nimport type { ReactElement } from 'react';\r\nimport { useContext } from 'react';\r\n// import { useState, useRef, useContext, useEffect, MouseEvent } from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { format, add } from 'date-fns';\r\nimport { useMedia } from 'react-use';\r\nimport { MediaQuery } from '../../../styles/mediaQuery';\r\nimport AppContext from '../../../utils/createContext';\r\n// import type { ViewportType, AirportType, FlightType } from '../../../utils/types';\r\nimport './FareComponent.css';\r\n// import planeImage from '../../../assets/images/aircraft.png';\r\n\r\nexport function FareComponent(props: any): ReactElement {\r\n const {\r\n originAirport,\r\n // setOriginAirport,\r\n destinationAirport,\r\n // setDestinationAirport,\r\n // flightType,\r\n // nonstopChecked,\r\n // setNonstopChecked,\r\n } = useContext(AppContext);\r\n\r\n const selectedRoute = {\r\n origin: props.origin,\r\n destination: props.destination,\r\n msg: props.msg,\r\n };\r\n // Specifying \"as keyof typof priceHash\" due to error \"expression of type string cannot be used to index type 'Object'\"\r\n const routePrice =\r\n priceHash[\r\n // props.origin as keyof typeof priceHash + '-' + props.destination as keyof typeof priceHash\r\n // (`${props.origin as keyof typeof priceHash}-${props.destination}`) as keyof typeof priceHash\r\n `${props.origin}-${props.destination}` as keyof typeof priceHash\r\n // `${originAirport.iata_code}-${destinationAirport.iata_code}` as keyof typeof priceHash\r\n ];\r\n // Needs DESTINATION to ORIGIN URL difference configured\r\n // ORIGIN to DESTINATION\r\n // const departureDate = format(add(Date.now(), { days: 60 }).setDate(1), 'yyyy-MM-dd');\r\n // const returnDate = format(add(Date.now(), { days: 63 }).setDate(1), 'yyyy-MM-dd');\r\n // const lowFareCalTo = \"https://www.southwest.com/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&lapInfantPassengersCount=0&passengerType=ADULT&returnAirportCode=¤cyCode=USD&originationAirportCode=\" + props.origin + \"&destinationAirportCode=\" + props.destination + \"&departureDate=\" + departureDate + \"&returnDate=\" + returnDate + \"&tripType=roundtrip&int=rtmaplfc\";\r\n // const lowFareCalTo =\r\n // 'https://www.southwest.com/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&lapInfantPassengersCount=0&passengerType=ADULT&returnAirportCode=¤cyCode=USD&originationAirportCode={props.origin}&destinationAirportCode={props.destination}&tripType=roundtrip&int=rtmaplfccard';\r\n\r\n // const lowFareCalFrom =\r\n // 'https://www.southwest.com/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&lapInfantPassengersCount=0&passengerType=ADULT&returnAirportCode=¤cyCode=USD&originationAirportCode=' +\r\n // props.destination +\r\n // '&destinationAirportCode=' +\r\n // props.origin +\r\n // '&tripType=roundtrip&int=rtmaplfccard';\r\n // const LFC = {\r\n // url: \"\",\r\n // build: function BuildLfc() {\r\n // if ( selectedRoute.origin !== undefined && selectedRoute.destination !== undefined ) {\r\n // this.url = lowFareCalFrom;\r\n // }\r\n // this.url = lowFareCalTo;\r\n // }\r\n // }\r\n\r\n // LFC URL copied from ../MapNavigation/MapNavigation\r\n const departureDate = format(add(Date.now(), { days: 60 }).setDate(1), 'yyyy-MM-dd');\r\n const returnDate = format(add(Date.now(), { days: 63 }).setDate(1), 'yyyy-MM-dd');\r\n\r\n const departureDateMobile = format(add(Date.now(), { days: 60 }).setDate(1), 'MM/dd/yyyy');\r\n const returnDateMobile = format(add(Date.now(), { days: 63 }).setDate(1), 'MM/dd/yyyy');\r\n const isMobile = useMedia(MediaQuery.XSmall);\r\n\r\n const submitUrl = () => {\r\n const currentUrl = window.location.href;\r\n const isMweb = new RegExp('channel=mweb', 'g');\r\n const isIos = new RegExp('channel=ios', 'g');\r\n const isAndroid = new RegExp('channel=android', 'g');\r\n const isIpad = new RegExp('channel=ipad', 'g');\r\n let result = '';\r\n\r\n if (!originAirport.airport_name || !destinationAirport.airport_name) {\r\n result = '/route-map/#map-section';\r\n } else if (isMweb.test(currentUrl) || isMobile) {\r\n result = `/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&passengerType=ADULT&promoCode=&returnAirportCode=¤cyCode=USD&originationAirportCode=${originAirport.iata_code}&destinationAirportCode=${destinationAirport.iata_code}&departureDate=${departureDate}&returnDate=${returnDate}&tripType=roundtrip&int=rtmaplfc&dummyvar1=${departureDateMobile}&dummyVar2=${returnDateMobile}&useLowFareCalendar=true&lapInfantPassengersCount=0clk=ROUTE_MAP_MWEB_${originAirport.iata_code}_${destinationAirport.iata_code}`;\r\n } else if (isIos.test(currentUrl) || isAndroid.test(currentUrl) || isIpad.test(currentUrl)) {\r\n result = `app:airbooking?fromCity=${originAirport.iata_code}&toCity=${destinationAirport.iata_code}&tripType=RT&INT=rtmaplfc&departDate=${departureDate}&returnDate=${returnDate}`;\r\n } else {\r\n result = `/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&lapInfantPassengersCount=0&passengerType=ADULT&promoCode=&returnAirportCode=¤cyCode=USD&originationAirportCode=${originAirport.iata_code}&destinationAirportCode=${destinationAirport.iata_code}&departureDate=${departureDate}&returnDate=${returnDate}&tripType=roundtrip&int=rtmaplfc&clk=ROUTE_MAP_${originAirport.iata_code}_${destinationAirport.iata_code}`;\r\n }\r\n return result;\r\n };\r\n\r\n // Import LFMA fare data - Method 1\r\n // useEffect(() => {\r\n // const script = document.createElement('script');\r\n // script.src = \"../../../assets/scripts/lfma.js\";\r\n // script.async = true;\r\n // document.body.appendChild(script);\r\n // return () => {\r\n // document.body.removeChild(script);\r\n // }\r\n // }, []);\r\n\r\n function FareMessage() {\r\n return (\r\n <div id=\"routeFare\">\r\n <a\r\n href={submitUrl()}\r\n aria-label=\"Find flights\"\r\n className=\"cta\"\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >\r\n <small className=\"fare--heading\">{selectedRoute.msg}</small>\r\n <div className=\"fare--price\">${routePrice}</div>\r\n </a>\r\n </div>\r\n // <div id=\"routeFare\" className=\"sky\" style={{background: \"none\"}}>\r\n // {/* Plane animation */}\r\n // <div className=\"banner\">\r\n // <span><small className=\"fare--heading\">{selectedRoute.msg}</small> <strong>${routePrice}</strong></span>\r\n // </div>\r\n // <img src={planeImage}></img>\r\n // </div>\r\n );\r\n }\r\n\r\n function NoFareMessage() {\r\n return (\r\n <div id=\"routeFare\" style={{ padding: '0.7813rem 1.25rem', marginTop: '3px' }}>\r\n <a\r\n href={submitUrl()}\r\n aria-label=\"View fares on the Low Fare Calendar\"\r\n className=\"cta\"\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n style={{ textDecoration: 'underline' }}\r\n >\r\n <small className=\"fare--heading\">\r\n <FormattedMessage\r\n id=\"map-info-nofare-message\"\r\n description=\"Fare information unavailable\"\r\n defaultMessage=\"View fares on the Low Fare Calendar\"\r\n />\r\n </small>\r\n </a>\r\n </div>\r\n );\r\n }\r\n\r\n function SelectionMessage() {\r\n return (\r\n <div id=\"routeFare\" style={{ padding: '0.7813rem 1.25rem', marginTop: '3px' }}>\r\n <small className=\"fare--heading\">\r\n <FormattedMessage\r\n id=\"map-info-select-destination-message\"\r\n description=\"Select a destination\"\r\n defaultMessage=\"Select a destination\"\r\n />\r\n </small>\r\n </div>\r\n );\r\n }\r\n function Message() {\r\n if (routePrice !== undefined) {\r\n return <FareMessage />;\r\n }\r\n if (\r\n selectedRoute.origin &&\r\n selectedRoute.destination !== undefined &&\r\n routePrice === undefined\r\n ) {\r\n return <NoFareMessage />;\r\n }\r\n return <SelectionMessage />;\r\n }\r\n\r\n // useEffect(() => {\r\n // if (props.origin && props.destination) {\r\n // // Specifying \"as keyof typof priceHash\" due to error \"expression of type string cannot be used to index type 'Object'\"\r\n // const routePrice = priceHash[props.origin as keyof typeof priceHash + \"-\" + props.destination as keyof typeof priceHash];\r\n // alert(\"O&D sent. Price: \" + routePrice);\r\n // if ( routePrice !== undefined ) {\r\n\r\n // }\r\n\r\n // } else {\r\n // alert(\"O&D not sent\");\r\n // }\r\n // }, [props.origin, props.destination]);\r\n\r\n return <Message />;\r\n}\r\n","/* eslint-disable max-lines */\nimport type { ReactElement } from 'react';\nimport { useState, useRef, useContext, useEffect, MouseEvent } from 'react';\nimport type { FeatureCollection, GeoJsonProperties, LineString } from 'geojson';\nimport type { AnyProps, PointFeature, ClusterFeature } from 'supercluster';\nimport ReactMapGL, { FlyToInterpolator, Source, Layer, MapRef } from 'react-map-gl';\nimport { useMedia } from 'react-use';\nimport mapboxgl from 'mapbox-gl';\nimport { FormattedMessage } from 'react-intl';\nimport useSupercluster from '../../../hooks/useSupercluster';\nimport {\n StyledMapContainer,\n StyledLocationName,\n StyledNavigationControl,\n StyledMarker,\n StyledGlobeButton,\n StyledLocationDot,\n StyledClusterNumber,\n StyleLocationContainerWithFare,\n} from './MapContainer.styles';\nimport AppContext from '../../../utils/createContext';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport type { AirportType, FlightType } from '../../../utils/types';\nimport useRouteLine from '../../../hooks/useRouteLine';\nimport { InformationContent } from '../../molecules/InformationContent/InformationContent';\nimport { ZoomLevels } from '../../../data/constants';\nimport { isConnected, isNonstop, isUnserved } from '../../../utils/checkFlightType';\nimport { theme } from '../../../styles/theme/default';\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport { FallbackMap } from '../FallbackMap/FallbackMap';\nimport { ListViewButton } from '../../molecules/ListViewButton/ListViewButton';\nimport { useExternalBoolean, useExternalBooleanLabels } from '../../../hooks/useExternalValue';\nimport { FareComponent } from '../FareComponent/FareComponent';\n// fix for transpiling issue, see https://github.com/mapbox/mapbox-gl-js/issues/10173\n// prettier-ignore\n// eslint-disable-next-line @typescript-eslint/no-var-requires,import/extensions,import/no-unresolved,import/no-webpack-loader-syntax, @typescript-eslint/no-explicit-any\n(mapboxgl as any).workerClass = require('worker-loader!mapbox-gl/dist/mapbox-gl-csp-worker').default;\n\nexport function MapContainer(): ReactElement {\n const {\n viewport,\n setViewport,\n airportsData,\n points,\n setPoints,\n originAirport,\n setOriginAirport,\n destinationAirport,\n setDestinationAirport,\n setFlightType,\n nonstopChecked,\n setGoToHawaii,\n mapboxKey,\n mapboxStyleUrl,\n mapFailed,\n setMapFailed,\n setShowDisabledModal,\n setShowDisabledModalConnection,\n } = useContext(AppContext);\n const isDesktop = useMedia(MediaQuery.Large);\n const isTablet = useMedia(MediaQuery.Medium);\n const curvedLine = useRouteLine({ originAirport, destinationAirport });\n const [route, setRoute] = useState<FeatureCollection<LineString, GeoJsonProperties> | []>({\n type: 'FeatureCollection',\n features: [curvedLine],\n });\n const mapRef = useRef<MapRef>(null);\n\n const showNumbers = useExternalBoolean('showNumbers');\n const showLabels = useExternalBooleanLabels('showLabels');\n\n useEffect(() => {\n const airportPoints: Array<PointFeature<AnyProps>> = airportsData\n .filter((airport: AirportType) => {\n if (\n (originAirport.iata_code && airport.iata_code === originAirport.iata_code) ||\n (destinationAirport.iata_code && airport.iata_code === destinationAirport.iata_code)\n ) {\n return false;\n }\n return true;\n })\n .map((airport: AirportType) => ({\n type: 'Feature',\n properties: { cluster: false, airport, category: airport.federal_unit },\n geometry: {\n type: 'Point',\n coordinates: [parseFloat(airport.longitude), parseFloat(airport.latitude)],\n },\n }));\n setPoints(airportPoints);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [airportsData, originAirport, destinationAirport]);\n\n const bounds = mapRef.current ? mapRef.current.getMap().getBounds().toArray().flat() : null;\n\n const { clusters, supercluster } = useSupercluster({\n points,\n bounds,\n zoom: viewport.zoom,\n options: { radius: 30, maxZoom: 20 }, // clusters-radius\n });\n\n const handleClusterClick = (cluster: PointFeature<AnyProps> | ClusterFeature<AnyProps>) => {\n const [longitude, latitude] = cluster.geometry.coordinates;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const expansionZoom = Math.min(supercluster!.getClusterExpansionZoom(cluster.id as number), 20);\n setViewport({\n ...viewport,\n latitude,\n longitude,\n zoom: expansionZoom,\n transitionInterpolator: new FlyToInterpolator({ speed: 2 }),\n transitionDuration: 'auto',\n });\n };\n\n const handleClusterClickZoom = (cluster: PointFeature<AnyProps> | ClusterFeature<AnyProps>) => {\n const [longitude, latitude] = cluster.geometry.coordinates;\n\n setViewport({\n ...viewport,\n latitude,\n longitude,\n zoom: 8,\n transitionInterpolator: new FlyToInterpolator({ speed: 2 }),\n transitionDuration: 'auto',\n });\n };\n\n const handleAirportClick = (airport: AirportType | Record<string, never>, disabled: boolean) => {\n if (airport.suspended || (disabled && !nonstopChecked)) {\n setShowDisabledModal(true);\n return;\n }\n if (disabled && nonstopChecked) {\n setShowDisabledModalConnection(true);\n return;\n }\n if (airport.iata_code === originAirport.iata_code) {\n setOriginAirport({});\n setDestinationAirport({});\n } else if (airport.iata_code === destinationAirport.iata_code) {\n setDestinationAirport({});\n } else if (originAirport.airport_name) {\n setDestinationAirport(airport);\n } else {\n setOriginAirport(airport);\n }\n };\n\n const zoomOut = () => {\n setViewport({\n ...viewport,\n longitude: -97.9, // viewport-settings\n latitude: 36.3,\n zoom: isDesktop ? ZoomLevels.OutermostDesktop : ZoomLevels.OutermostMobile,\n transitionInterpolator: new FlyToInterpolator({ speed: 1 }),\n transitionDuration: 2200,\n });\n };\n\n useEffect(() => {\n setRoute({\n ...route,\n features: [curvedLine],\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [curvedLine]);\n\n useEffect(() => {\n let type: FlightType = 'none';\n if (originAirport.iata_code && destinationAirport.iata_code) {\n if (originAirport.nonstop.includes(destinationAirport.iata_code)) {\n type = 'nonstop';\n } else if (isConnected(originAirport, destinationAirport)) {\n type = 'connected';\n }\n }\n setFlightType(type);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [originAirport, destinationAirport]);\n\n // LFMA fare data - Method 1 hook\n // useEffect(() => {\n // const script = document.createElement('script');\n // script.src = \"../../../assets/scripts/lfma.js\";\n // script.async = true;\n // document.body.appendChild(script);\n // return () => {\n // document.body.removeChild(script);\n // }\n // }, []);\n\n const departMessage = (\n <FormattedMessage\n id=\"map-info-depart-message\"\n description=\"Fare component origin message\"\n defaultMessage=\"Depart as low as*\"\n />\n );\n const returnMessage = (\n <FormattedMessage\n id=\"map-info-return-message\"\n description=\"Fare component origin message\"\n defaultMessage=\"Depart as low as*\"\n />\n );\n\n const clusterGroups = clusters.map((cluster) => {\n const [longitude, latitude] = cluster.geometry.coordinates;\n const { cluster: isCluster, point_count: pointCount, airport } = cluster.properties;\n const connected = !isCluster ? isConnected(originAirport, airport) : undefined;\n const unservedAirport = !isCluster ? isUnserved(originAirport, airport) : undefined;\n const selected =\n !isCluster &&\n (airport.iata_code === originAirport.iata_code ||\n airport.iata_code === destinationAirport.iata_code);\n\n if (isCluster) {\n const majorHub = cluster.properties.airports.find(\n (currentAirport: { properties: { airport: AirportType } }) =>\n currentAirport.properties.airport.major_hub,\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let popularStation: any;\n if (viewport.zoom >= ZoomLevels.Middle) {\n popularStation = cluster.properties.airports.find(\n (currentAirport: { properties: { airport: AirportType } }) =>\n currentAirport.properties.airport.popular_station,\n );\n }\n\n const unservedCluster = cluster.properties.airports.map(\n (currentAirport: { properties: { airport: AirportType } }) => {\n return isUnserved(originAirport, currentAirport.properties.airport);\n },\n );\n const connectingCluster = cluster.properties.airports.map(\n (currentAirport: { properties: { airport: AirportType } }) => {\n return isConnected(originAirport, currentAirport.properties.airport);\n },\n );\n const nonstopCluster = cluster.properties.airports.map(\n (currentAirport: { properties: { airport: AirportType } }) => {\n return isNonstop(originAirport, currentAirport.properties.airport);\n },\n );\n\n const clusterLabel = () => {\n if (majorHub) {\n // eslint-disable-next-line no-nested-ternary\n return showNumbers && !showLabels ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n {pointCount}\n </StyledClusterNumber>\n ) : // eslint-disable-next-line no-nested-ternary\n showLabels && !showNumbers ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n <span>{majorHub.properties.airport.city_served}</span>\n </StyledClusterNumber>\n ) : // eslint-disable-next-line no-nested-ternary\n showLabels && showNumbers ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n <span>{majorHub.properties.airport.city_served}</span>\n {pointCount}\n </StyledClusterNumber>\n ) : !showLabels && !showNumbers ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n ></StyledClusterNumber>\n ) : (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n {' '}\n <span>{majorHub.properties.airport.city_served}</span>\n </StyledClusterNumber>\n );\n }\n if (popularStation) {\n // eslint-disable-next-line no-nested-ternary\n return showNumbers && !showLabels ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n {pointCount}\n </StyledClusterNumber>\n ) : // eslint-disable-next-line no-nested-ternary\n showLabels && !showNumbers ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n <span>{popularStation.properties.airport.city_served}</span>\n </StyledClusterNumber>\n ) : // eslint-disable-next-line no-nested-ternary\n showLabels && showNumbers ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n <span>{popularStation.properties.airport.city_served}</span>\n {pointCount}\n </StyledClusterNumber>\n ) : !showLabels && !showNumbers ? (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n ></StyledClusterNumber>\n ) : (\n <StyledClusterNumber\n $isConnected={\n connectingCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !unservedCluster.includes(true)\n }\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n {' '}\n <span>{popularStation.properties.airport.city_served}</span>\n </StyledClusterNumber>\n );\n }\n return showNumbers ? (\n <StyledClusterNumber\n $isNumber\n $isConnected={!nonstopCluster.includes(true) && connectingCluster.includes(true)}\n $isUnserved={\n unservedCluster.includes(true) &&\n !nonstopCluster.includes(true) &&\n !connectingCluster.includes(true)\n }\n $isNonstop={nonstopCluster.includes(true)}\n $nonStopOnly={nonstopChecked}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n >\n {pointCount}\n </StyledClusterNumber>\n ) : (\n <StyledClusterNumber\n $isConnected={connectingCluster.includes(true) && !nonstopCluster.includes(true)}\n $isNumber={false}\n className={\n // eslint-disable-next-line no-nested-ternary\n nonstopCluster.includes(true)\n ? 'marker cluster-label-marker solid-blue'\n : connectingCluster.includes(true) && !nonstopChecked\n ? 'marker cluster-label-marker hollow-blue'\n : 'marker cluster-label-marker solid-gray'\n }\n ></StyledClusterNumber>\n );\n };\n\n return (\n <StyledMarker\n className=\"marker cluster-label-marker\"\n key={cluster.id}\n longitude={longitude}\n latitude={latitude}\n $isCluster\n >\n <StyledLocationName\n type=\"button\"\n className={\n unservedCluster.includes(false) || (nonstopChecked && !nonstopCluster.includes(true))\n ? `cluster-size-${pointCount}`\n : 'marker-is-disabled'\n } // unserved-cluster-styling\n $isActive={false}\n $isSuspended={false}\n $isCluster\n $isConnected={connectingCluster.includes(true) && !nonstopCluster.includes(true)}\n $isUnserved={\n (!nonstopCluster.includes(true) &&\n !connectingCluster.includes(true) &&\n unservedCluster.includes(true)) ||\n (!nonstopCluster.includes(true) && nonstopChecked)\n }\n $pointCount={pointCount}\n $isInSeasonalService={false}\n onClick={() =>\n pointCount === 2 ? handleClusterClickZoom(cluster) : handleClusterClick(cluster)\n }\n tabIndex={-1}\n $nonStopOnly={nonstopChecked}\n >\n {clusterLabel()}\n </StyledLocationName>\n </StyledMarker>\n );\n }\n\n const zoomLevelMiddleAndPopularStation =\n (isDesktop || (!isDesktop && !originAirport.iata_code) || !destinationAirport.iata_code) &&\n viewport.zoom >= ZoomLevels.Middle &&\n airport.popular_station;\n const zoomLevelInnermost =\n (isDesktop || (!isDesktop && !originAirport.iata_code) || !destinationAirport.iata_code) &&\n viewport.zoom >= ZoomLevels.Innermost;\n const selectedOnMobile =\n !isDesktop &&\n originAirport.iata_code &&\n destinationAirport.iata_code &&\n (airport.iata_code === originAirport.iata_code ||\n airport.iata_code === destinationAirport.iata_code);\n const mobileCluster =\n isCluster && !isDesktop && !originAirport.iata_code && !destinationAirport.iata_code;\n const isDisabled =\n unservedAirport || (nonstopChecked && connected) || airport.suspended || !airport.operational;\n\n if (\n (!isCluster && airport.major_hub) ||\n zoomLevelMiddleAndPopularStation ||\n zoomLevelInnermost ||\n selectedOnMobile ||\n mobileCluster\n ) {\n return (\n <StyledMarker\n className=\"marker location-label-marker\"\n key={airport.iata_code}\n longitude={longitude}\n latitude={latitude}\n $isActive={selected}\n $isPopulair={airport.popular_station}\n >\n <StyledLocationName\n className={\n // eslint-disable-next-line no-nested-ternary\n isDisabled\n ? 'marker-is-disabled solid-grey'\n : connected\n ? 'hollow-blue'\n : 'solid-blue'\n }\n type=\"button\"\n onClick={() => handleAirportClick(airport, isDisabled)}\n $isActive={selected}\n $isConnected={connected}\n $isSuspended={airport.suspended || !airport.operational}\n $isInSeasonalService={airport.seasonal_service}\n tabIndex={-1}\n >\n {airport.route_map_display_name}\n {airport.seasonal_service && <Icon.Umbrella />}\n </StyledLocationName>\n </StyledMarker>\n );\n }\n return (\n <StyledMarker\n className=\"marker location-dot-marker \"\n key={airport.iata_code}\n longitude={longitude}\n latitude={latitude}\n >\n <StyledLocationDot\n // eslint-disable-next-line no-nested-ternary\n className={isDisabled ? 'solid-grey' : connected ? 'hollow-blue' : 'solid-blue'}\n onClick={() => handleAirportClick(airport, isDisabled)}\n $unavailable={unservedAirport || (nonstopChecked && connected) || isDisabled}\n $isSuspended={airport.suspended}\n $isInSeasonalService={airport.seasonal_service}\n $isUnserved={nonstopChecked}\n $isConnected={connected}\n >\n {airport.seasonal_service && <Icon.Umbrella />}\n </StyledLocationDot>\n </StyledMarker>\n );\n });\n\n return (\n <StyledMapContainer>\n {mapFailed ? (\n <FallbackMap />\n ) : (\n <>\n <ReactMapGL\n {...viewport}\n mapboxApiAccessToken={mapboxKey}\n width=\"100%\"\n height=\"100%\"\n onViewportChange={(event: MouseEvent) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n setViewport(event);\n setGoToHawaii(false);\n }}\n mapStyle={mapboxStyleUrl}\n maxZoom={10}\n minZoom={isDesktop ? ZoomLevels.OutermostDesktop : ZoomLevels.OutermostMobile}\n onError={() => {\n setMapFailed(true);\n }}\n attributionControl // map-attribution\n ref={mapRef}\n >\n {originAirport.longitude && destinationAirport.longitude && (\n <Source\n id=\"map-line\"\n type=\"geojson\"\n data={route as unknown as FeatureCollection<LineString, GeoJsonProperties>}\n >\n <Layer\n id=\"route\"\n source=\"route\"\n type=\"line\"\n paint={\n isConnected(originAirport, destinationAirport)\n ? {\n 'line-width': 2,\n 'line-color': theme.color.blue,\n 'line-dasharray': [8, 2],\n }\n : {\n 'line-width': 2,\n 'line-color': theme.color.blue,\n }\n }\n />\n </Source>\n )}\n {clusterGroups}\n {originAirport.iata_code && (\n <StyledMarker\n className=\"marker active-label-marker\"\n key={originAirport.iata_code}\n longitude={parseFloat(originAirport.longitude)}\n latitude={parseFloat(originAirport.latitude)}\n $isActive\n >\n <StyleLocationContainerWithFare>\n <FareComponent\n msg={departMessage}\n origin={originAirport.iata_code}\n destination={destinationAirport.iata_code}\n />\n <StyledLocationName\n type=\"button\"\n onClick={() => handleAirportClick(originAirport, false)}\n $isActive\n tabIndex={-1}\n >\n {originAirport.route_map_display_name}\n </StyledLocationName>\n </StyleLocationContainerWithFare>\n </StyledMarker>\n )}\n {destinationAirport.iata_code && (\n <StyledMarker\n className=\"marker active-label-marker\"\n key={destinationAirport.iata_code}\n longitude={parseFloat(destinationAirport.longitude)}\n latitude={parseFloat(destinationAirport.latitude)}\n $isActive\n >\n <StyleLocationContainerWithFare>\n <FareComponent\n msg={returnMessage}\n origin={destinationAirport.iata_code}\n destination={originAirport.iata_code}\n />\n <StyledLocationName\n type=\"button\"\n onClick={() => handleAirportClick(destinationAirport, false)}\n $isActive\n tabIndex={-1}\n >\n {destinationAirport.route_map_display_name}\n </StyledLocationName>\n </StyleLocationContainerWithFare>\n </StyledMarker>\n )}\n {isTablet && (\n <StyledNavigationControl aria-label=\"zoom control buttons\" showCompass={false} />\n )}\n </ReactMapGL>\n <InformationContent />\n <ListViewButton />\n <StyledGlobeButton aria-label=\"reset map zoom\" onClick={zoomOut}>\n <Icon.Globe />\n </StyledGlobeButton>\n </>\n )}\n </StyledMapContainer>\n );\n}\n","// eslint-disable-next-line no-shadow\nexport enum LocalStorageKey {\n RecentSearches = 'recentSearches',\n}\n","import styled from 'styled-components';\nimport { Paragraph } from '../../atoms/Paragraph/Paragraph';\nimport { Icon } from '../../atoms/Icon/Icon';\n\nexport const StyledCheckmark = styled(Icon.Checkmark)``;\n\nexport const StyledText = styled(Paragraph)`\n margin-left: 0.625rem;\n`;\n\nexport const StyledLabel = styled.label<{ $isDisabled?: boolean }>`\n position: relative;\n display: inline-block;\n cursor: ${({ $isDisabled }) => $isDisabled && 'not-allowed'};\n color: ${({ $isDisabled, theme }) => $isDisabled && theme.color.grey};\n`;\n\nexport const StyledInput = styled.input`\n cursor: ${({ disabled }) => disabled && 'not-allowed'};\n`;\n","import styled from 'styled-components';\nimport { size } from 'polished';\nimport SimpleBar from 'simplebar-react';\nimport { Paragraph, ParagraphId } from '../../atoms/Paragraph/Paragraph';\nimport { Button } from '../../molecules/Button/Button';\nimport { Checkbox } from '../../molecules/Checkbox/Checkbox';\nimport { pseudo } from '../../../styles/helpers/pseudo';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\nimport { zIndex } from '../../../styles/zIndex';\n\nexport const StyledMapNavigation = styled.div`\n position: relative;\n background: ${({ theme }) => theme.color.white};\n box-shadow: 0 0.25rem 1.25rem rgba(48, 76, 178, 0.2);\n z-index: ${zIndex('overlay')};\n\n @media ${respondTo(MediaQuery.Large)} {\n width: 26.25rem;\n min-width: 26.25rem;\n height: 100vh;\n }\n`;\n\nexport const StyledScrollWrapper = styled(SimpleBar)<{ $openSelector: boolean }>`\n padding: 1.875rem 1.25rem 6.875rem;\n width: 100%;\n\n .simplebar-content {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n\n &::before,\n &::after {\n content: none;\n }\n }\n\n ${({ $openSelector }) =>\n !$openSelector &&\n `\n .simplebar-content-wrapper {\n mask-image: linear-gradient(to bottom, black calc(100% - 7.1875rem), transparent calc(100% - 5rem));\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n .simplebar-content-wrapper {\n mask-image: linear-gradient(to bottom, black calc(100% - 8.4375rem), transparent calc(100% - 6.25rem));\n }\n }\n `}\n\n ${({ $openSelector }) =>\n $openSelector &&\n `\n z-index: ${zIndex('overlay')};\n `}\n\n @media ${respondTo(MediaQuery.Large)} {\n padding: 3.125rem 1.875rem 7.5rem;\n max-height: 100vh;\n height: 100%;\n }\n\n @media ${respondTo(MediaQuery.XLarge)} {\n }\n`;\n\nexport const StyledIntroText = styled(Paragraph)`\n margin: 0.625rem 0 1.5625rem;\n`;\n\nexport const StyledSubmitButton = styled(Button)`\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.xSmall};\n left: 0.3125rem;\n width: calc(100% - 0.625rem);\n margin-top: 1.875rem;\n`;\n\nexport const StyledFlightSummary = styled.div`\n display: flex;\n padding: 1.5rem 1rem;\n margin: 2.5rem 0 0.9375rem;\n background: ${({ theme }) => theme.color.white};\n border: 1px solid ${({ theme }) => theme.color.lighterGrey};\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.normal};\n`;\n\nexport const StyledFlightTypeIndicator = styled(Paragraph)<{ $flightType: string }>`\n position: relative;\n display: flex;\n align-items: flex-end;\n margin-right: 1.0625rem;\n color: ${({ theme }) => theme.color.blue};\n\n &::before,\n &::after {\n ${pseudo()};\n top: 0.3125rem;\n left: 40%;\n transform: translateX(-50%);\n }\n\n &::before {\n ${size('0.4375rem')};\n border-radius: 50%;\n background-color: ${({ theme }) => theme.color.blue};\n }\n\n &::after {\n ${size('calc(100% - 1.5625rem)', '1px')};\n background: ${({ theme }) => theme.color.blue};\n }\n\n svg {\n ${size('1.0625rem')};\n }\n\n ${({ $flightType, theme }) =>\n $flightType === 'connected' &&\n `\n &::after {\n background: transparent;\n background-image: linear-gradient(${theme.color.blue} 60%, rgba(255,255,255,0) 0%);\n background-position: right;\n background-size: 1px 8px;\n background-repeat: repeat-y;\n }\n `}\n`;\n\nexport const StyledFlightLocation = styled(Paragraph)`\n color: ${({ theme }) => theme.color.black};\n\n span {\n display: block;\n margin-top: 0.3125rem;\n color: ${({ theme }) => theme.color.grey};\n }\n`;\n\nexport const StyledFlightType = styled(ParagraphId)`\n margin: 0.875rem 0;\n color: ${({ theme }) => theme.color.blue};\n`;\n\nexport const StyledAdditionalInformation = styled.div`\n margin-top: 0.625rem;\n color: ${({ theme }) => theme.color.grey};\n line-height: 1.428;\n\n strong {\n display: block;\n }\n\n a {\n color: ${({ theme }) => theme.color.blue};\n text-decoration: underline;\n }\n\n img {\n display: block;\n margin: 0.9375rem 0;\n }\n`;\n\nexport const StyledCheckbox = styled(Checkbox)`\n margin-top: 1.25rem;\n`;\n","import type { ReactElement } from 'react';\nimport { StyledLabel, StyledInput, StyledText } from './Checkbox.styles';\nimport { ParagraphType } from '../../atoms/Paragraph/Paragraph.data';\n\ntype CheckboxProps = {\n label: string;\n name: string;\n checked: boolean;\n disabled: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange?: (value: any) => void;\n};\n\nexport const Checkbox = ({\n label,\n name,\n checked,\n disabled,\n onChange,\n ...props\n}: CheckboxProps): ReactElement => {\n return (\n <StyledLabel {...props} $isDisabled={disabled}>\n <StyledInput\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n />\n <StyledText forwardedAs=\"span\" type={ParagraphType.Large}>\n {label}\n </StyledText>\n </StyledLabel>\n );\n};\n","import styled from 'styled-components';\nimport { ellipsis, rgba, size } from 'polished';\nimport SimpleBar from 'simplebar-react';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport { Paragraph } from '../../atoms/Paragraph/Paragraph';\nimport { zIndex } from '../../../styles/zIndex';\nimport { pseudo } from '../../../styles/helpers/pseudo';\nimport { FontWeight, TransitionDuration } from '../../../styles/variables';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { Ease } from '../../../styles/easing';\nimport { hover } from '../../../styles/helpers/hover';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\n\nexport const StyledLocationSelector = styled.div<{ $isOpen: boolean }>`\n padding-top: 0.9375rem;\n\n ${({ theme, $isOpen }) =>\n $isOpen &&\n `\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n max-height: 100vh;\n width: 100vw;\n padding: 4.9375rem 1.25rem 0;\n z-index: ${zIndex('overlay')};\n background-color: ${theme.color.white};\n\n &::before {\n ${pseudo()};\n top: 0;\n left: 0;\n height: 3.5rem;\n width: 100vw;\n background-color: ${theme.color.blue};\n }\n `}\n\n @media ${respondTo(MediaQuery.Large)} {\n position: relative;\n padding: 0.9375rem 0 0;\n height: 6.3125rem;\n\n > div {\n border: 2px solid transparent;\n }\n\n &::before {\n content: none;\n }\n\n ${({ $isOpen, theme }) =>\n $isOpen &&\n `\n width: 100%;\n\n > div {\n position: absolute;\n top: 2.625rem;\n left: 0.0625rem;\n width: 100%;\n border-color: ${theme.color.lighterGrey};\n background-color: ${theme.color.white};\n box-shadow: 0 0.75rem 1rem rgba(0, 0, 0, 0.05);\n }\n `}\n }\n`;\n\nexport const StyledInputWrapper = styled.div<{ $isOpen: boolean; $isFocussed: boolean }>`\n position: relative;\n display: flex;\n align-items: center;\n height: 3.75rem;\n padding: 0.25rem 3.125rem 0.25rem 3.25rem;\n border: 1px solid ${({ theme }) => theme.color.lighterGrey};\n background-color: ${({ theme }) => theme.color.white};\n cursor: pointer;\n\n ${({ $isOpen }) =>\n $isOpen &&\n `\n margin 0 -1.25rem;\n height: 3.5rem;\n border-right: 0;\n border-left: 0;\n `}\n\n &::after {\n ${pseudo()};\n ${size('calc(100% + 4px)')};\n top: -2px;\n left: -2px;\n opacity: 0;\n transition: opacity ${TransitionDuration.Normal} ${Ease.EaseOut};\n border: 2px solid ${({ theme }) => theme.color.lighterGrey};\n pointer-events: none;\n }\n\n ${({ $isFocussed, theme }) =>\n $isFocussed &&\n `\n &::after {\n width: calc(100% + 2px);\n height: calc(100% + 2px);\n top: -1px;\n left: -1px;\n opacity: 1;\n border: 1px solid ${theme.color.blue};\n box-shadow: 0px 0px 4px ${theme.color.blue};\n }\n `}\n\n ${hover(`\n &::after {\n opacity: 1;\n }\n `)}\n\n @media ${respondTo(MediaQuery.Large)} {\n margin: 0;\n padding-left: 3.4375rem;\n\n ${({ $isOpen }) =>\n $isOpen &&\n `\n border-top: 0;\n `}\n }\n`;\n\nexport const StyledOverlayLabel = styled(Paragraph)`\n position: absolute;\n top: 1.375rem;\n left: 1.25rem;\n font-weight: ${FontWeight.Bold};\n color: ${({ theme }) => theme.color.white};\n`;\n\nexport const StyledCloseButton = styled(AbstractButton)`\n ${size('0.875rem')};\n position: absolute;\n top: 1.3125rem;\n right: 1.75rem;\n color: ${({ theme }) => theme.color.white};\n`;\n\nexport const StyledLabel = styled.label`\n ${typeStyle.normal};\n height: 1rem;\n display: block;\n font-weight: ${FontWeight.Bold};\n margin-bottom: 0.5rem;\n`;\n\nexport const StyledPlaceholder = styled(AbstractButton)`\n ${typeStyle.large};\n ${ellipsis()};\n`;\n\nexport const StyledAirplaneIcon = styled(Icon.Airplane)<{ $isDeparture: boolean }>`\n ${size('1.125rem')};\n position: absolute;\n top: 50%;\n left: 1.125rem;\n transform: translateY(-50%) rotate(-135deg);\n color: ${({ theme }) => rgba(theme.color.black, 0.8)};\n\n ${({ $isDeparture }) =>\n $isDeparture &&\n `\n transform: translateY(-50%) rotate(-45deg);\n `}\n\n @media ${respondTo(MediaQuery.Large)} {\n left: 1.25rem;\n }\n`;\n\nexport const StyledChevron = styled(AbstractButton)`\n ${size('1.375rem')};\n position: absolute;\n top: 50%;\n right: 0.9375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => theme.color.blue};\n transform: translateY(-50%);\n pointer-events: none;\n\n svg {\n ${size('0.875rem')};\n }\n\n &:focus {\n border: 1px solid ${({ theme }) => theme.color.blue};\n box-shadow: 0px 0px 4px ${({ theme }) => theme.color.blue};\n }\n`;\n\nexport const StyledInput = styled.input`\n ${typeStyle.large};\n display: flex;\n align-items: center;\n height: 100%;\n width: 100%;\n`;\n\nexport const StyledClearButton = styled(AbstractButton)`\n ${size('1.375rem')};\n cursor: pointer;\n position: absolute;\n top: 50%;\n right: 0.9375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => theme.color.darkerBlue};\n transform: translateY(-50%);\n z-index: ${zIndex('default')};\n\n svg {\n ${size('0.75rem')};\n }\n\n &:focus {\n border: 1px solid ${({ theme }) => theme.color.blue};\n box-shadow: 0px 0px 4px ${({ theme }) => theme.color.blue};\n }\n`;\n\nexport const StyledResultWrapper = styled(SimpleBar)`\n position: absolute !important;\n left: 1.25rem;\n max-height: calc(100% - 9.9375rem);\n width: calc(100% - 1.5625rem);\n\n .simplebar-content-wrapper {\n mask-image: linear-gradient(to bottom, transparent 0%, black 5%, black 94%, transparent 100%);\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n position: relative !important;\n top: 0;\n left: 0;\n max-height: 50vh;\n width: calc(100% - 0.3125rem);\n }\n`;\n\nexport const StyledResultList = styled.ul<{ $additionalSpace?: boolean }>`\n position: relative;\n padding: 0 0 1.25rem 2.25rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n padding: 0 0 1.25rem 3.4375rem;\n }\n\n ${({ $additionalSpace }) =>\n $additionalSpace &&\n `\n padding-top: 1.25rem;\n\n @media ${respondTo(MediaQuery.Large)} {\n padding-top: 1.25rem;\n }\n `}\n`;\n\nexport const StyledDivider = styled.span`\n ${typeStyle.large};\n position: relative;\n width: 100%;\n display: flex;\n align-items: center;\n padding: 0.375rem 0 1.25rem;\n margin-left: -1.875rem;\n color: ${({ theme }) => theme.color.grey};\n white-space: nowrap;\n\n &::after {\n ${pseudo('block', 'static')};\n ${size('1px', '100%')};\n margin-left: 1.3125rem;\n background-color: ${({ theme }) => theme.color.lighterGrey};\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n ${typeStyle.normal};\n }\n`;\n\nexport const StyledListItem = styled(AbstractButton)`\n ${typeStyle.large};\n display: block;\n cursor: pointer;\n margin-bottom: 0.875rem;\n color: ${({ theme }) => theme.color.black};\n transition: transform ${TransitionDuration.Normal} ${Ease.EaseOut};\n text-align: left;\n\n &.location-is-disabled {\n cursor: not-allowed;\n color: ${({ theme }) => theme.color.grey};\n }\n\n span {\n display: block;\n margin-top: 0.125rem;\n color: ${({ theme }) => theme.color.grey};\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n margin-bottom: 1rem;\n }\n\n &:not(:disabled) {\n ${hover(`\n transform: translateX(0.25rem);\n `)}\n\n &:focus {\n transform: translateX(0.25rem);\n }\n }\n`;\n","import styled, { keyframes } from 'styled-components';\nimport { position, rgba, size } from 'polished';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\nimport { typeStyle } from '../../../styles/typeStyle';\nimport { Ease } from '../../../styles/easing';\nimport { pseudo } from '../../../styles/helpers/pseudo';\nimport { TransitionDuration } from '../../../styles/variables';\n\nexport const StyledCurrentLocation = styled(AbstractButton)`\n ${typeStyle.large};\n height: 3.75rem;\n position: relative;\n padding-left: 2.25rem;\n display: flex;\n align-items: center;\n cursor: pointer;\n transition: padding-left ${TransitionDuration.Normal} ${Ease.EaseOut};\n\n &:focus {\n padding-left: 2.5rem;\n }\n\n @media ${respondTo(MediaQuery.Large)} {\n padding-left: 3.4375rem;\n\n &:focus {\n padding-left: 3.75rem;\n }\n }\n`;\n\nexport const loader = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`;\n\nexport const StyledLoader = styled.div`\n ${typeStyle.large};\n display: flex;\n align-items: center;\n height: 3.75rem;\n margin: 0 1.375rem;\n`;\n\nexport const StyledSpinner = styled.div`\n ${size('1.5rem')};\n position: relative;\n border-radius: 50%;\n background: ${({ theme }) =>\n `linear-gradient(to right, ${theme.color.blue} 0%, ${rgba(theme.color.blue, 0)} 70%)`};\n animation: ${loader} 2s ${Ease.EaseInOutCirc} infinite;\n transform: translateZ(0);\n overflow: hidden;\n margin-right: 0.625rem;\n &::after {\n ${size('90%')};\n ${pseudo()};\n ${position(0)};\n background: ${({ theme }) => theme.color.white};\n border-radius: 50%;\n margin: auto;\n }\n`;\n\nexport const StyledLocationArrow = styled(Icon.LocationArrow)`\n ${size('1rem')};\n position: absolute;\n left: 0;\n color: ${({ theme }) => theme.color.blue};\n\n @media ${respondTo(MediaQuery.Large)} {\n left: 1.25rem;\n }\n`;\n","import { ReactElement, useContext } from 'react';\nimport * as turf from '@turf/turf';\nimport { FormattedMessage } from 'react-intl';\nimport {\n StyledCurrentLocation,\n StyledSpinner,\n StyledLoader,\n StyledLocationArrow,\n} from './CurrentLocation.styles';\nimport AppContext from '../../../utils/createContext';\nimport type { AirportType } from '../../../utils/types';\n\ntype CurrentLocationProps = {\n onLocationChange: (airport: AirportType, disabled: boolean) => void;\n isDisabled: (airport: AirportType) => boolean;\n};\n\nexport function CurrentLocation({\n onLocationChange,\n isDisabled,\n}: CurrentLocationProps): ReactElement {\n const { airportsData, setUserLocation, setUserLocationError } = useContext(AppContext);\n let searching = false;\n const handleCurrentLocation = (geo: GeolocationPosition) => {\n if (geo) {\n searching = false;\n const currentLocation = turf.point([geo.coords.longitude, geo.coords.latitude]);\n const points = airportsData.map((airport: AirportType) =>\n turf.point([parseFloat(airport.longitude), parseFloat(airport.latitude)], {\n code: airport.iata_code,\n }),\n );\n const nearestPoint = turf.nearest(currentLocation, turf.featureCollection(points));\n const [nearestAirport] = airportsData.filter(\n (airport: AirportType) => airport.iata_code === nearestPoint.properties.code,\n );\n onLocationChange(nearestAirport, isDisabled(nearestAirport));\n }\n };\n const getCurrentPosition = () => {\n searching = true;\n navigator.geolocation.getCurrentPosition(\n (geolocation) => {\n setUserLocationError(false);\n setUserLocation(geolocation);\n handleCurrentLocation(geolocation);\n },\n (error) => error && setUserLocationError(true),\n );\n };\n\n return (\n <>\n {!searching ? (\n <StyledCurrentLocation onClick={getCurrentPosition}>\n <StyledLocationArrow />\n <FormattedMessage\n id=\"navigation-current-location-button\"\n description=\"Current location button copy\"\n defaultMessage=\"Current Location\"\n />\n </StyledCurrentLocation>\n ) : (\n <StyledLoader>\n <StyledSpinner />\n <FormattedMessage\n id=\"navigation-current-location-loading\"\n description=\"Loading message\"\n defaultMessage=\"Loading...\"\n />\n </StyledLoader>\n )}\n </>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AirportType } from '../utils/types';\n\ntype AlphabeticListType = {\n letter: string;\n airports: Array<AirportType>;\n};\n\nconst useAlphabeticList = (airportsData: Array<AirportType>): Array<AlphabeticListType> => {\n const [list, setList] = useState<Array<AlphabeticListType>>([]);\n useEffect(() => {\n if (airportsData.length > 0) {\n const alphabeticAirportsList = airportsData.reduce(\n (accumulator: Array<AlphabeticListType>, airport: AirportType) => {\n const firstLetter = airport.booking_widget_display_name[0].toLocaleLowerCase();\n if (!accumulator.some((item) => item.letter === firstLetter)) {\n accumulator.push({ letter: firstLetter, airports: [airport] });\n } else {\n const letterObject = accumulator?.find((object) => object.letter === firstLetter);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const letterObjectIndex = accumulator?.indexOf(letterObject!);\n accumulator[letterObjectIndex].airports.push(airport);\n }\n return accumulator;\n },\n [],\n );\n setList(alphabeticAirportsList);\n }\n }, [airportsData]);\n const alphaList = list.sort((a, b) => a.letter.localeCompare(b.letter));\n return alphaList;\n};\n\nexport default useAlphabeticList;\n","import type { AirportType } from './types';\n\nexport const isCurrent = (\n origin: AirportType | Record<string, never>,\n current: AirportType | Record<string, never>,\n): boolean => !!(origin.iata_code && origin.iata_code === current.iata_code);\n","/* eslint-disable max-lines */\nimport type { Dispatch, FormEvent, ReactElement, SetStateAction, MouseEvent } from 'react';\nimport { useEffect, useRef, useState, useContext } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { useMedia, useEvent, useLocalStorage } from 'react-use';\nimport Fuse from 'fuse.js';\nimport { disableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\nimport type SimpleBar from 'simplebar-react';\nimport {\n StyledAirplaneIcon,\n StyledChevron,\n StyledCloseButton,\n StyledInput,\n StyledInputWrapper,\n StyledLabel,\n StyledListItem,\n StyledLocationSelector,\n StyledOverlayLabel,\n StyledPlaceholder,\n StyledResultList,\n StyledResultWrapper,\n StyledDivider,\n StyledClearButton,\n} from './LocationSelector.styles';\nimport { Paragraph, ParagraphType } from '../../atoms/Paragraph/Paragraph';\nimport AppContext from '../../../utils/createContext';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { CurrentLocation } from '../CurrentLocation/CurrentLocation';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport type { AirportType } from '../../../utils/types';\nimport { LocalStorageKey } from '../../../data/keys';\nimport useAlphabeticList from '../../../hooks/useAlphabeticList';\nimport { isConnected, isUnserved } from '../../../utils/checkFlightType';\nimport { isCurrent } from '../../../utils/checkAirport';\nimport useMount from '../../../hooks/useMount';\nimport useUnmount from '../../../hooks/useUnmount';\n\ntype LocationSelectorProps = {\n location: AirportType | Record<string, never>;\n setLocation: Dispatch<SetStateAction<AirportType | Record<string, unknown>>>;\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n label: string;\n placeholder: string;\n overlayLabel: string;\n isDeparture?: boolean;\n};\n\nexport function LocationSelector({\n location,\n setLocation,\n isDeparture = false,\n label,\n placeholder,\n overlayLabel,\n isOpen,\n setIsOpen,\n}: LocationSelectorProps): ReactElement {\n const {\n airportsData,\n originAirport,\n destinationAirport,\n setDestinationAirport,\n nonstopChecked,\n showDisabledModal,\n setShowDisabledModal,\n setShowDisabledModalConnection,\n userLocationError,\n } = useContext(AppContext);\n const alphabeticList = useAlphabeticList(airportsData);\n const [query, setQuery] = useState('');\n const [isFocussed, setIsFocussed] = useState(false);\n const [isChosen, setIsChosen] = useState(false);\n const [searchSuggestions, setSearchSuggestions] = useState<Array<Fuse.FuseResult<AirportType>>>(\n [],\n );\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const [recentSearches, setRecentSearches]: [\n Array<AirportType>,\n Dispatch<SetStateAction<Array<AirportType>>>,\n ] = useLocalStorage(LocalStorageKey.RecentSearches, []);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const placeholderRef = useRef<HTMLButtonElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<SimpleBar>(null);\n const isDesktop = useMedia(MediaQuery.Large);\n\n useEffect(() => {\n if (isOpen) {\n inputRef.current?.focus();\n } else {\n inputRef.current?.blur();\n }\n }, [isOpen]);\n\n const fuse = new Fuse(airportsData, {\n keys: [\n 'airport_name',\n 'booking_widget_display_name',\n 'iata_code',\n 'federal_unit',\n 'alt_search_names',\n ],\n minMatchCharLength: 3,\n includeScore: true,\n threshold: 0.2,\n });\n\n const handleSearchQuery = (searchTerm: string) => {\n if (!isOpen) {\n setIsOpen(true);\n }\n setQuery(searchTerm);\n if (searchTerm.length < 2) {\n setSearchSuggestions([]);\n }\n const results = fuse.search(searchTerm.toLowerCase());\n // .filter((result) => result.score && result.score < 0.03);\n setSearchSuggestions(results as Array<Fuse.FuseResult<AirportType>>);\n };\n\n const openModal = () => {\n if (!isOpen) {\n setIsOpen(true);\n setTimeout(() => {\n if (scrollRef.current) {\n disableBodyScroll(scrollRef.current.getScrollElement());\n }\n }, 0);\n }\n };\n\n const closeModal = () => {\n if (isOpen) {\n setIsOpen(false);\n setQuery('');\n setSearchSuggestions([]);\n clearAllBodyScrollLocks();\n }\n };\n\n const toggleModal = () => {\n if (!isOpen) {\n openModal();\n }\n };\n\n const onLocationChange = (airport: AirportType, disabled: boolean) => {\n if (airport.suspended || (disabled && !nonstopChecked)) {\n setShowDisabledModal(true);\n } else if (disabled && nonstopChecked) {\n setShowDisabledModalConnection(true);\n } else {\n setIsChosen(true);\n setQuery('');\n setSearchSuggestions([]);\n closeModal();\n setLocation(airport);\n const temporarySearchesArray = recentSearches?.filter(\n (locationItem) => locationItem.iata_code !== airport.iata_code,\n );\n if (temporarySearchesArray.length >= 3) {\n temporarySearchesArray.splice(2, 1);\n }\n setRecentSearches([airport, ...temporarySearchesArray]);\n }\n };\n\n const handleRemoveLocation = (event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n event.stopPropagation();\n if (isDeparture) {\n setDestinationAirport({});\n }\n setLocation({});\n };\n\n const handleMousedown = (event: Event) => {\n if (isOpen && !showDisabledModal && !wrapperRef.current?.contains(event.target as Node)) {\n closeModal();\n }\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (isOpen && !showDisabledModal && event.key === 'Escape') {\n closeModal();\n } else if (isOpen && isChosen) {\n setLocation({});\n setIsFocussed(true);\n inputRef.current?.focus();\n }\n };\n\n const handleBlur = () => {\n setIsFocussed(false);\n };\n\n useEvent('mousedown', (event) => handleMousedown(event), document);\n useEvent('keydown', (event) => handleKeydown(event as KeyboardEvent), document);\n\n useMount(() => {\n inputRef.current?.addEventListener('blur', () => {\n handleBlur();\n });\n });\n\n useUnmount(() => {\n inputRef.current?.removeEventListener('blur', () => {\n handleBlur();\n });\n });\n\n useEvent(\n 'focus',\n () => {\n setIsFocussed(true);\n },\n inputRef.current,\n );\n\n useEvent(\n 'focus',\n () => {\n setIsFocussed(true);\n },\n placeholderRef.current,\n );\n\n useEvent(\n 'blur',\n () => {\n setIsFocussed(false);\n },\n placeholderRef.current,\n );\n\n const isDisabled = (airport: AirportType) => {\n return (\n (!isDeparture && isUnserved(originAirport, airport)) ||\n (isDeparture && isUnserved(destinationAirport, airport)) ||\n (nonstopChecked && isConnected(originAirport, airport)) ||\n isCurrent(originAirport, airport) ||\n isCurrent(destinationAirport, airport) ||\n airport.suspended ||\n !airport.operational\n );\n };\n\n return (\n <StyledLocationSelector $isOpen={isOpen}>\n {isOpen && !isDesktop && (\n <>\n <StyledOverlayLabel type={ParagraphType.Normal}>{overlayLabel}</StyledOverlayLabel>\n <StyledCloseButton onClick={closeModal}>\n <Icon.Close />\n </StyledCloseButton>\n </>\n )}\n <StyledLabel htmlFor={StyledInput}>{label}</StyledLabel>\n <div ref={wrapperRef}>\n <StyledInputWrapper\n aria-label={isDeparture ? 'select departing airport' : 'select arrival airport'}\n onClick={toggleModal}\n $isOpen={isOpen}\n $isFocussed={isFocussed}\n >\n <StyledAirplaneIcon $isDeparture={isDeparture} />\n {location?.iata_code ? (\n <StyledPlaceholder ref={placeholderRef}>\n {location?.booking_widget_display_name}\n </StyledPlaceholder>\n ) : (\n <StyledInput\n placeholder={placeholder}\n onChange={(event: FormEvent<HTMLInputElement>) =>\n handleSearchQuery(event.currentTarget.value)\n }\n value={query}\n ref={inputRef}\n />\n )}\n {location.airport_name && (\n <StyledClearButton\n type=\"button\"\n onClick={(event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) =>\n handleRemoveLocation(event)\n }\n >\n <Icon.Close />\n </StyledClearButton>\n )}\n {!isOpen && !location.iata_code && (\n <StyledChevron onClick={toggleModal}>\n <Icon.ChevronDown />\n </StyledChevron>\n )}\n </StyledInputWrapper>\n {isOpen && (\n <StyledResultWrapper ref={scrollRef} autoHide={false}>\n {searchSuggestions.length > 0 ? (\n <StyledResultList $additionalSpace>\n {searchSuggestions.map(({ item }) => (\n <StyledListItem\n className={isDisabled(item) ? 'location-is-disabled' : ''}\n key={item.iata_code}\n onClick={() => onLocationChange(item, isDisabled(item))}\n >\n {item.booking_widget_display_name}\n <Paragraph type={ParagraphType.Normal} as=\"span\">\n {item.iata_code}\n </Paragraph>\n </StyledListItem>\n ))}\n </StyledResultList>\n ) : (\n <div>\n {!userLocationError && (\n <CurrentLocation onLocationChange={onLocationChange} isDisabled={isDisabled} />\n )}\n <StyledResultList $additionalSpace={userLocationError}>\n <StyledDivider>\n <FormattedMessage\n id=\"navigation-recent-searches-label\"\n description=\"Recent searches copy\"\n defaultMessage=\"Recent searches\"\n />\n </StyledDivider>\n {recentSearches.map((item: AirportType) => (\n <StyledListItem\n className={isDisabled(item) ? 'location-is-disabled' : ''}\n key={item.iata_code}\n onClick={() => onLocationChange(item, isDisabled(item))}\n >\n {item.booking_widget_display_name}\n\n <Paragraph type={ParagraphType.Small} as=\"span\">\n {item.iata_code}\n </Paragraph>\n </StyledListItem>\n ))}\n {alphabeticList.length > 0 &&\n alphabeticList.map((alphabeticObject) => (\n <div key={alphabeticObject.letter}>\n <StyledDivider>{alphabeticObject.letter.toUpperCase()}</StyledDivider>\n {alphabeticObject.airports.map((item: AirportType) => (\n <StyledListItem\n className={isDisabled(item) ? 'location-is-disabled' : ''}\n key={item.iata_code}\n onClick={() => onLocationChange(item, isDisabled(item))}\n >\n {item.booking_widget_display_name}\n\n <Paragraph type={ParagraphType.Normal} as=\"span\">\n {item.iata_code}\n </Paragraph>\n </StyledListItem>\n ))}\n </div>\n ))}\n </StyledResultList>\n </div>\n )}\n </StyledResultWrapper>\n )}\n </div>\n </StyledLocationSelector>\n );\n}\n","import { EffectCallback, useEffect } from 'react';\n\n/**\n * @param callback - function, which is triggered on mount. If the function returns a callback, it will be called on unmount.\n */\nexport default function useMount(callback: EffectCallback): void {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(callback, []);\n}\n","import { useEffect } from 'react';\n\n/**\n * @param destructor - function, which is triggered on unmount.\n */\nexport default function useUnmount(destructor: () => void): void {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => destructor, []);\n}\n","import sanitizeHtml from 'sanitize-html';\n\nexport const parseHtml = (htmlString: string) => ({\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __html: sanitizeHtml(htmlString, {\n allowedTags: sanitizeHtml.defaults.allowedTags.concat(\n // eslint-disable-next-line dot-notation\n window['__swaStationMessageAllowedTags'],\n ),\n allowedAttributes: {\n // eslint-disable-next-line dot-notation\n '*': window['__swaStationMessageAllowedAttributes'],\n },\n }),\n});\n","// eslint-disable-next-line import/no-cycle\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { useContext, useState, ReactElement, useEffect } from 'react';\r\nimport { format, add } from 'date-fns';\r\nimport { useMedia } from 'react-use';\r\nimport AppContext from '../../../utils/createContext';\r\nimport {\r\n StyledMapNavigation,\r\n StyledIntroText,\r\n StyledSubmitButton,\r\n StyledAdditionalInformation,\r\n StyledCheckbox,\r\n StyledFlightSummary,\r\n StyledFlightTypeIndicator,\r\n StyledFlightLocation,\r\n StyledFlightType,\r\n StyledScrollWrapper,\r\n} from './MapNavigation.styles';\r\nimport { Heading } from '../../atoms/Heading/Heading';\r\n// eslint-disable-next-line import/no-cycle\r\nimport { LocationSelector } from '../../molecules/LocationSelector/LocationSelector';\r\nimport { Icon } from '../../atoms/Icon/Icon';\r\nimport { parseHtml } from '../../../utils/sanitiseHtml';\r\nimport { MediaQuery } from '../../../styles/mediaQuery';\r\n\r\ndeclare global {\r\n interface Window {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n __swaStationMessageAllowedTags: Array<string>;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n __swaStationMessageAllowedAttributes: Array<string>;\r\n }\r\n}\r\n\r\nexport function MapNavigation(): ReactElement {\r\n const {\r\n originAirport,\r\n setOriginAirport,\r\n destinationAirport,\r\n setDestinationAirport,\r\n flightType,\r\n nonstopChecked,\r\n setNonstopChecked,\r\n } = useContext(AppContext);\r\n const intl = useIntl();\r\n const [originSelectorOpen, setOriginSelectorOpen] = useState(false);\r\n const [destinationSelectorOpen, setDestinationSelectorOpen] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!originAirport.iata_code) {\r\n setNonstopChecked(false);\r\n }\r\n });\r\n\r\n const nonstopChangeHandler = () => {\r\n setNonstopChecked(!nonstopChecked);\r\n };\r\n\r\n const connectingFlightChosen = !!(\r\n originAirport.iata_code &&\r\n destinationAirport.iata_code &&\r\n flightType !== 'nonstop'\r\n );\r\n\r\n const departureDate = format(add(Date.now(), { days: 60 }).setDate(1), 'yyyy-MM-dd');\r\n const returnDate = format(add(Date.now(), { days: 63 }).setDate(1), 'yyyy-MM-dd');\r\n\r\n const departureDateMobile = format(add(Date.now(), { days: 60 }).setDate(1), 'MM/dd/yyyy');\r\n const returnDateMobile = format(add(Date.now(), { days: 63 }).setDate(1), 'MM/dd/yyyy');\r\n const isMobile = useMedia(MediaQuery.XSmall);\r\n\r\n const submitUrl = () => {\r\n const currentUrl = window.location.href;\r\n const isMweb = new RegExp('channel=mweb', 'g');\r\n const isIos = new RegExp('channel=ios', 'g');\r\n const isAndroid = new RegExp('channel=android', 'g');\r\n const isIpad = new RegExp('channel=ipad', 'g');\r\n let result = '';\r\n\r\n if (!originAirport.airport_name || !destinationAirport.airport_name) {\r\n result = '/route-map/#map-section';\r\n } else if (isMweb.test(currentUrl) || isMobile) {\r\n result = `/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&passengerType=ADULT&promoCode=&returnAirportCode=¤cyCode=USD&originationAirportCode=${originAirport.iata_code}&destinationAirportCode=${destinationAirport.iata_code}&departureDate=${departureDate}&returnDate=${returnDate}&tripType=roundtrip&int=rtmaplfc&dummyvar1=${departureDateMobile}&dummyVar2=${returnDateMobile}&useLowFareCalendar=true&lapInfantPassengersCount=0&clk=ROUTE_MAP_FIND_FLIGHTS_${originAirport.iata_code}_${destinationAirport.iata_code}`;\r\n } else if (isIos.test(currentUrl) || isAndroid.test(currentUrl) || isIpad.test(currentUrl)) {\r\n result = `app:airbooking?fromCity=${originAirport.iata_code}&toCity=${destinationAirport.iata_code}&tripType=RT&INT=rtmaplfc&departDate=${departureDate}&returnDate=${returnDate}`;\r\n } else {\r\n result = `/air/low-fare-calendar/select-dates.html?adultPassengersCount=1&lapInfantPassengersCount=0&passengerType=ADULT&promoCode=&returnAirportCode=¤cyCode=USD&originationAirportCode=${originAirport.iata_code}&destinationAirportCode=${destinationAirport.iata_code}&departureDate=${departureDate}&returnDate=${returnDate}&tripType=roundtrip&int=rtmaplfc&clk=ROUTE_MAP_FIND_FLIGHTS_${originAirport.iata_code}_${destinationAirport.iata_code}`;\r\n }\r\n return result;\r\n };\r\n\r\n return (\r\n <StyledMapNavigation>\r\n <StyledScrollWrapper $openSelector={originSelectorOpen || destinationSelectorOpen}>\r\n <div>\r\n {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}\r\n {/* @ts-ignore */}\r\n <Heading id=\"navigation-heading\">\r\n <FormattedMessage\r\n id=\"navigation-heading\"\r\n description=\"heading\"\r\n defaultMessage=\"Southwest Airlines Route Map\"\r\n />\r\n </Heading>\r\n {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}\r\n {/* @ts-ignore */}\r\n <StyledIntroText id=\"navigation-intro-text\">\r\n <FormattedMessage\r\n id=\"navigation-intro-text\"\r\n description=\"intro text\"\r\n defaultMessage=\"Where do you wanna go? Use our interactive map to find your next flight.\"\r\n />\r\n </StyledIntroText>\r\n <LocationSelector\r\n isOpen={originSelectorOpen}\r\n setIsOpen={setOriginSelectorOpen}\r\n label={intl.formatMessage({\r\n id: 'navigation-depart-label',\r\n description: 'Depart label',\r\n defaultMessage: 'Depart',\r\n })}\r\n placeholder={intl.formatMessage({\r\n id: 'navigation-depart-placeholder',\r\n description: 'Depart placeholder',\r\n defaultMessage: 'From',\r\n })}\r\n overlayLabel={intl.formatMessage({\r\n id: 'navigation-depart-overlay-label',\r\n description: 'Depart overlay label',\r\n defaultMessage: 'Departure Locations',\r\n })}\r\n isDeparture\r\n location={originAirport}\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n setLocation={setOriginAirport}\r\n />\r\n <LocationSelector\r\n isOpen={destinationSelectorOpen}\r\n setIsOpen={setDestinationSelectorOpen}\r\n label={intl.formatMessage({\r\n id: 'navigation-arrive-label',\r\n description: 'Arrive label',\r\n defaultMessage: 'Arrive',\r\n })}\r\n placeholder={intl.formatMessage({\r\n id: 'navigation-arrive-placeholder',\r\n description: 'Arrive placeholder',\r\n defaultMessage: 'To',\r\n })}\r\n overlayLabel={intl.formatMessage({\r\n id: 'navigation-arrive-overlay-label',\r\n description: 'Arrive overlay label',\r\n defaultMessage: 'Arrival Locations',\r\n })}\r\n location={destinationAirport}\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n setLocation={setDestinationAirport}\r\n />\r\n <StyledCheckbox\r\n label={intl.formatMessage({\r\n id: 'navigation-checkbox-nonstop',\r\n defaultMessage: 'Nonstop only ',\r\n description: 'Nonstop label',\r\n })}\r\n name=\"nonstop\"\r\n onChange={nonstopChangeHandler}\r\n checked={nonstopChecked}\r\n disabled={!originAirport.iata_code || connectingFlightChosen}\r\n />\r\n {originAirport.airport_name && destinationAirport.airport_name && (\r\n <StyledFlightSummary id=\"navigation-flight-summary\">\r\n <StyledFlightTypeIndicator\r\n id=\"navigation-flight-summary-illustration\"\r\n $flightType={flightType}\r\n >\r\n <Icon.Airplane />\r\n </StyledFlightTypeIndicator>\r\n <div>\r\n <StyledFlightLocation id=\"navigation-flight-depart\">\r\n {originAirport.airport_name}\r\n <span>{originAirport.booking_widget_display_name}</span>\r\n </StyledFlightLocation>\r\n <StyledFlightType id=\"navigation-flight-type\">\r\n {flightType === 'connected' ? (\r\n <FormattedMessage\r\n id=\"navigation-flight-type-connecting\"\r\n description=\"flight type information connecting\"\r\n defaultMessage=\"Connecting flight\"\r\n />\r\n ) : (\r\n <FormattedMessage\r\n id=\"navigation-flight-type-nonstop\"\r\n description=\"flight type information nonstop\"\r\n defaultMessage=\"Nonstop flight\"\r\n />\r\n )}\r\n </StyledFlightType>\r\n <StyledFlightLocation id=\"navigation-flight-arrive\">\r\n {destinationAirport.airport_name}\r\n <span>{destinationAirport.booking_widget_display_name}</span>\r\n </StyledFlightLocation>\r\n </div>\r\n </StyledFlightSummary>\r\n )}\r\n </div>\r\n <StyledAdditionalInformation>\r\n {originAirport.station_message && (\r\n <div dangerouslySetInnerHTML={parseHtml(originAirport.station_message)} />\r\n )}\r\n {destinationAirport.station_message && (\r\n <>\r\n <br />\r\n <div dangerouslySetInnerHTML={parseHtml(destinationAirport.station_message)} />\r\n </>\r\n )}\r\n </StyledAdditionalInformation>\r\n\r\n <StyledSubmitButton\r\n aria-label=\"Find flights\"\r\n id=\"find-flights-button\"\r\n disabled={!originAirport.airport_name || !destinationAirport.airport_name}\r\n tabIndex={\r\n !originAirport.airport_name || !destinationAirport.airport_name ? -1 : undefined\r\n }\r\n href={submitUrl()}\r\n enforceLink\r\n >\r\n <FormattedMessage\r\n id=\"navigation-button-submit\"\r\n description=\"submit button\"\r\n defaultMessage=\"Find flights\"\r\n />\r\n </StyledSubmitButton>\r\n </StyledScrollWrapper>\r\n </StyledMapNavigation>\r\n );\r\n}\r\n","import styled from 'styled-components';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\n\nexport const StyledWidgetContainer = styled.div<{ 'data-reverse'?: boolean }>`\n position: relative;\n display: flex;\n flex-direction: ${(props) => (props['data-reverse'] ? 'column-reverse' : 'column')};\n\n @media ${respondTo(MediaQuery.Large)} {\n flex-direction: ${(props) => (props['data-reverse'] ? 'row-reverse' : 'row')};\n }\n`;\n","import styled from 'styled-components';\nimport { size } from 'polished';\nimport { zIndex } from '../../../styles/zIndex';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { respondTo } from '../../../styles/helpers/respondTo';\nimport { pseudo } from '../../../styles/helpers/pseudo';\nimport { Ease } from '../../../styles/easing';\nimport { FontSize, FontWeight, TransitionDuration } from '../../../styles/variables';\nimport { hover } from '../../../styles/helpers/hover';\n\nexport const StyledInsetMap = styled.div<{ 'data-reverse'?: boolean; $routeActive: boolean }>`\n position: absolute;\n bottom: 36.5625rem;\n left: ${(props) => (props['data-reverse'] ? '1.25rem' : 'calc(1.25rem + 26.25rem)')};\n filter: drop-shadow(0px 0px 20px rgba(48, 76, 178, 0.05));\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.normal};\n overflow: hidden;\n z-index: ${zIndex('overlay')};\n img {\n top: 0.125rem;\n border: 2px solid ${({ theme }) => theme.color.white};\n }\n\n @media ${respondTo(MediaQuery.Medium)} {\n ${size('7.6875rem', '12.5rem')};\n bottom: 36.5625rem;\n ${({ $routeActive }) =>\n $routeActive &&\n `\n ${size('6.4375rem', '10rem')};\n bottom: 50.5rem;\n `}\n }\n @media ${respondTo(MediaQuery.Large)} {\n ${size('10rem', '16.25rem')};\n bottom: 1.875rem;\n }\n`;\n\ntype StyledClusterNumberProps = {\n $isConnected?: boolean;\n $isUnserved?: boolean;\n};\n\nexport const StyledClusterNumber = styled.div<StyledClusterNumberProps>`\n cursor: pointer;\n font-size: ${FontSize.Normal};\n font-weight: ${FontWeight.Bold};\n color: ${({ theme }) => theme.color.white};\n margin-top: 3.0625rem;\n margin-left: 7.7125rem;\n position: absolute;\n z-index: ${zIndex('map-overlay')};\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n\n &::before {\n ${pseudo()};\n ${size('2.9375rem')}\n position: absolute;\n z-index: -1;\n cursor: pointer;\n bottom: -2.0625rem;\n left: 0.3125rem;\n border-radius: 50%;\n background-color: ${({ theme }) => theme.color.clusterBlue};\n transform: translate(-50%, -50%);\n transition: transform ${TransitionDuration.Slow} ${Ease.EaseOutBack};\n }\n ${hover(`\n transform: translate(-0%, -8%);\n &::after {\n transform: translate(-50%, -50%);\n }\n `)}\n\n ${({ $isConnected, theme }) =>\n !$isConnected &&\n `\n color: ${theme.color.blue};\n\n &::before {\n border: 2px solid ${theme.color.blue};\n background-color: ${theme.color.white};\n }\n `}\n\n${({ $isUnserved, $isConnected, theme }) =>\n $isUnserved &&\n !$isConnected &&\n `\n cursor: not-allowed;\n color: ${theme.color.blue};\n\n &::before {\n cursor: not-allowed;\n border: transparent;\n background-color: ${theme.color.lighterGrey};\n }\n `}\n\n @media ${respondTo(MediaQuery.Medium)} {\n font-size: ${FontSize.Normal};\n height: 1.6875rem;\n margin-left: 50%;\n &::before {\n ${size('1.375rem')};\n bottom: -0.1875rem;\n }\n @media ${respondTo(MediaQuery.Large)} {\n font-size: ${FontSize.Large};\n height: 3.4375rem;\n margin-left: 50%;\n &::before {\n ${size('2.9375rem')};\n bottom: -0.3125rem;\n left: 0.4375rem;\n }\n }\n }\n`;\n","export default __webpack_public_path__ + \"static/media/hawaii.4c99e874.png\";","import { ReactElement, useContext, useEffect, useState } from 'react';\nimport { StyledInsetMap, StyledClusterNumber } from './InsetMap.styles';\nimport AppContext from '../../../utils/createContext';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport staticImage from '../../../assets/images/hawaii.png';\nimport { Image } from '../../atoms/Image/Image';\n\nexport function InsetMap(props: { [x: string]: boolean }): ReactElement {\n const { setGoToHawaii, hawaiiCount, nonstopChecked, originAirport, destinationAirport } =\n useContext(AppContext);\n const handleInsetMapClick = () => {\n setGoToHawaii(true);\n };\n\n const hawaiiNumber = hawaiiCount.length;\n\n const [hawaiiConnected, setHawaiiConnected] = useState(false);\n const [hawaiiUnserved, setHawaiiUnserved] = useState(false);\n const [hawaiiNonstop, setHawaiiNonstop] = useState(true);\n const hawaiiAirports = hawaiiCount.map((item) => item.iata_code);\n\n useEffect(() => {\n if (originAirport.nonstop) {\n const nonstop = hawaiiAirports.some((r) => originAirport.nonstop.includes(r));\n setHawaiiNonstop(nonstop);\n }\n if (originAirport.connected) {\n const connected = hawaiiAirports.some((r) => originAirport.connected.includes(r));\n setHawaiiConnected(connected);\n }\n if (originAirport.unserved) {\n const unserved = hawaiiAirports.some((r) => originAirport.unserved.includes(r));\n setHawaiiUnserved(unserved);\n }\n if (!originAirport.iata_code) {\n setHawaiiConnected(false);\n setHawaiiUnserved(false);\n setHawaiiNonstop(true);\n }\n }, [hawaiiAirports, originAirport]);\n return (\n <StyledInsetMap\n id=\"Hawaii-inset\"\n onClick={handleInsetMapClick}\n data-reverse={props['data-reverse']}\n aria-label=\"navigate to Hawaii\"\n $routeActive={Boolean(originAirport.iata_code && destinationAirport.iata_code)}\n >\n <Image\n alt=\"Go to Hawaii\"\n src={staticImage}\n contain\n source={[\n {\n media: MediaQuery.Small,\n srcset: staticImage,\n },\n ]}\n />\n <StyledClusterNumber\n $isConnected={hawaiiNonstop}\n $isUnserved={\n (hawaiiUnserved && !hawaiiNonstop && !hawaiiConnected) ||\n (!hawaiiNonstop && nonstopChecked)\n }\n >\n {hawaiiNumber}\n </StyledClusterNumber>\n </StyledInsetMap>\n );\n}\n","import styled from 'styled-components';\nimport { size } from 'polished';\nimport { AbstractButton } from '../../atoms/AbstractButton/AbstractButton';\nimport { FontSize } from '../../../styles/variables';\n\nexport const StyledModal = styled.div`\n min-width: 16.875rem;\n position: absolute;\n display: flex;\n align-items: center;\n font-size: ${FontSize.Normal};\n padding: 0.625rem;\n background: ${(props) => props.theme.color.white};\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n`;\n\nexport const StyledCloseButton = styled(AbstractButton)`\n ${size('2.1875rem')};\n display: flex;\n align-items: flex-start;\n align-self: flex-start;\n justify-content: center;\n color: ${({ theme }) => theme.color.blue};\n cursor: pointer;\n\n svg {\n ${size('0.875rem')};\n }\n\n &:focus {\n transform: scale(1.08);\n border: 1px solid ${({ theme }) => theme.color.blue};\n box-shadow: 0px 0px 4px ${({ theme }) => theme.color.blue};\n }\n`;\n","import { rgba } from 'polished';\nimport styled from 'styled-components';\nimport { respondTo } from '../../../../styles/helpers/respondTo';\nimport { MediaQuery } from '../../../../styles/mediaQuery';\nimport { theme } from '../../../../styles/theme/default';\nimport { zIndex } from '../../../../styles/zIndex';\n\nexport const StyledBackdrop = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n display: flex;\n background-color: ${rgba(theme.color.black, 0.5)};\n overflow-y: auto;\n z-index: ${zIndex('overlay')};\n\n @media ${respondTo(MediaQuery.Medium)} {\n padding: 2vw;\n }\n`;\n","import { ReactElement, MouseEvent, useCallback, useRef } from 'react';\nimport { useLockBodyScroll } from 'react-use';\nimport ReactDOM from 'react-dom';\nimport { StyledBackdrop } from './Backdrop.styles';\n\ninterface BackdropProps {\n children: React.ReactNode;\n onBackdropClick: (event: React.MouseEvent) => void;\n}\n\nexport default function Backdrop({ children, onBackdropClick }: BackdropProps): ReactElement {\n const backdrop = useRef<HTMLDivElement>(null);\n const body = useRef(document.body);\n\n useLockBodyScroll(true, body);\n\n const backdropClickHandler = useCallback(\n (event: MouseEvent) => {\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n\n if (event.target !== backdrop.current) {\n return;\n }\n\n onBackdropClick(event);\n },\n [onBackdropClick, backdrop],\n );\n\n const content = (\n <StyledBackdrop ref={backdrop} onClick={backdropClickHandler}>\n {children}\n </StyledBackdrop>\n );\n\n // eslint-disable-next-line unicorn/prefer-query-selector\n return ReactDOM.createPortal(content, document.getElementById('modal') as HTMLDivElement);\n}\n","import type { ReactElement, MouseEvent } from 'react';\nimport { noop } from 'lodash-es';\nimport { useIntl } from 'react-intl';\nimport { StyledModal, StyledCloseButton } from './Modal.styles';\nimport Backdrop from './Backdrop/Backdrop';\nimport { Icon } from '../../atoms/Icon/Icon';\nimport { parseHtml } from '../../../utils/sanitiseHtml';\n\nexport interface ModalSessionType {\n title: string;\n href: string;\n}\n\ninterface ModalProps {\n isPersistent?: boolean;\n onClose: (event: MouseEvent) => void;\n}\n\nexport function DisabledModal({\n onClose,\n isPersistent = false,\n ...props\n}: ModalProps): ReactElement {\n const intl = useIntl();\n return (\n <Backdrop onBackdropClick={isPersistent ? noop : onClose}>\n <StyledModal id=\"disabled-airport-modal\" {...props}>\n <div\n dangerouslySetInnerHTML={parseHtml(\n intl.formatMessage({\n id: 'disabled-modal-message',\n defaultMessage:\n \"<p><strong>FPO:</strong> We'd love to get you here, but please call <strong>1-800-I-FLY-SWA</strong> to see if you can book this route.</p>\",\n }),\n )}\n />\n {!isPersistent && (\n <StyledCloseButton onClick={onClose}>\n <Icon.Close />\n </StyledCloseButton>\n )}\n </StyledModal>\n </Backdrop>\n );\n}\n\nexport function DisabledModalConnection({\n onClose,\n isPersistent = false,\n ...props\n}: ModalProps): ReactElement {\n const intl = useIntl();\n return (\n <Backdrop onBackdropClick={isPersistent ? noop : onClose}>\n <StyledModal id=\"disabled-airport-modal-connection\" {...props}>\n <div\n dangerouslySetInnerHTML={parseHtml(\n intl.formatMessage({\n id: 'disabled-modal-connection-message',\n defaultMessage:\n \"<p><strong>FPO:</strong> We'd love to get you here, but please call <strong>1-800-I-FLY-SWA</strong> to see if you can book this route.</p>\",\n }),\n )}\n />\n {!isPersistent && (\n <StyledCloseButton onClick={onClose}>\n <Icon.Close />\n </StyledCloseButton>\n )}\n </StyledModal>\n </Backdrop>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useState, useEffect } from 'react';\nimport { useMedia } from 'react-use';\nimport { FlyToInterpolator } from 'react-map-gl';\nimport { parse, isBefore } from 'date-fns';\nimport type { AnyProps, PointFeature } from 'supercluster';\nimport { MapContainer } from '../MapContainer/MapContainer';\nimport { MapNavigation } from '../MapNavigation/MapNavigation';\nimport { StyledWidgetContainer } from './WidgetContainer.styles';\nimport AppContext from '../../../utils/createContext';\nimport { MediaQuery } from '../../../styles/mediaQuery';\nimport { InsetMap } from '../InsetMap/InsetMap';\nimport type { ViewportType, AirportType, FlightType } from '../../../utils/types';\nimport { ZoomLevels } from '../../../data/constants';\nimport { DisabledModal, DisabledModalConnection } from '../../molecules/DisabledModal/Modal';\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __swaMapboxKey: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __swaMapboxStyleUrl: string;\n }\n}\n\nexport function WidgetContainer(): ReactElement {\n const isDesktop = useMedia(MediaQuery.Large);\n const isTablet = useMedia(MediaQuery.Medium);\n const [viewport, setViewport] = useState<ViewportType>({\n longitude: -97.9, // viewport-settings\n latitude: 36.3,\n zoom: isDesktop ? ZoomLevels.OutermostDesktop : ZoomLevels.OutermostMobile,\n width: isDesktop ? '100%' : '100vw',\n height: '100%',\n });\n const [originAirport, setOriginAirport] = useState<AirportType | Record<string, never>>({});\n const [destinationAirport, setDestinationAirport] = useState<AirportType | Record<string, never>>(\n {},\n );\n const [airportsData, setAirportsData] = useState<Array<AirportType>>([]);\n const [points, setPoints] = useState<Array<PointFeature<AnyProps>>>([]);\n const [flightType, setFlightType] = useState<FlightType>('none');\n const [userLocation, setUserLocation] = useState<GeolocationPosition | undefined>();\n const [userLocationError, setUserLocationError] = useState<boolean>(false);\n const [goToHawaii, setGoToHawaii] = useState(false);\n const [nonstopChecked, setNonstopChecked] = useState<boolean>(false);\n const [mapFailed, setMapFailed] = useState(false);\n const [showDisabledModal, setShowDisabledModal] = useState(false);\n const [showDisabledModalConnection, setShowDisabledModalConnection] = useState(false);\n const [hawaiiCount, setHawaiiCount] = useState<Array<AirportType>>([]);\n\n // eslint-disable-next-line no-underscore-dangle\n const [mapboxKey] = useState(window.__swaMapboxKey);\n // eslint-disable-next-line no-underscore-dangle\n const [mapboxStyleUrl] = useState(window.__swaMapboxStyleUrl);\n\n const parseAirportsData = (data: { [index: string]: AirportType } | ArrayLike<AirportType>) =>\n Object.entries(data).map(([, airportData]) => airportData);\n\n useEffect(() => {\n if (!originAirport.iata_code && !destinationAirport.iata_code) {\n setNonstopChecked(false);\n }\n }, [originAirport, destinationAirport]);\n\n useEffect(() => {\n async function fetchAirports() {\n const data = await fetch('/swa-resources/generated/route_map/map_view.json')\n .then((response) => response.json())\n .then((array) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parseAirportsData(array).map((item: any) => ({\n ...item,\n operational: item.operate_date\n ? isBefore(parse(item.operate_date, 'yyyyMMdd', new Date()), Date.now())\n : true,\n })),\n )\n .catch((error) => console.log(error)); // eslint-disable-line no-console\n if (data) {\n setAirportsData(data);\n // setHawaiiCount(data.reduce((n, x) => n + (x.federal_unit === 'HI'), 0));\n const hawaiiStations: Array<AirportType> = [];\n // eslint-disable-next-line array-callback-return\n data.map((item) => {\n if (item.federal_unit === 'HI') {\n hawaiiStations.push(item);\n }\n });\n\n // setHawaiiCount(data.filter((item) => item.federal_unit === 'HI'));\n setHawaiiCount(hawaiiStations);\n }\n }\n fetchAirports();\n }, []);\n\n useEffect(() => {\n if (goToHawaii) {\n setViewport({\n ...viewport,\n longitude: -156.30340425996235,\n latitude: 20.580330248477598,\n zoom: ZoomLevels.Innermost,\n transitionInterpolator: new FlyToInterpolator({ speed: 1 }),\n transitionDuration: 'auto',\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [goToHawaii]);\n\n const { Provider } = AppContext;\n\n return (\n <Provider\n value={{\n viewport,\n setViewport,\n airportsData,\n points,\n setPoints,\n originAirport,\n setOriginAirport,\n destinationAirport,\n setDestinationAirport,\n flightType,\n setFlightType,\n userLocation,\n setUserLocation,\n userLocationError,\n setUserLocationError,\n goToHawaii,\n setGoToHawaii,\n isDesktop,\n nonstopChecked,\n setNonstopChecked,\n mapboxKey,\n mapboxStyleUrl,\n mapFailed,\n setMapFailed,\n showDisabledModal,\n setShowDisabledModal,\n showDisabledModalConnection,\n setShowDisabledModalConnection,\n hawaiiCount,\n }}\n >\n <StyledWidgetContainer data-reverse id=\"widget-container\">\n <MapNavigation />\n <MapContainer />\n {isTablet &&\n viewport.zoom < ZoomLevels.Innermost &&\n !mapFailed &&\n viewport.longitude > -150 && <InsetMap data-reverse />}\n {showDisabledModal && <DisabledModal onClose={() => setShowDisabledModal(false)} />}\n {showDisabledModalConnection && (\n <DisabledModalConnection onClose={() => setShowDisabledModalConnection(false)} />\n )}\n </StyledWidgetContainer>\n </Provider>\n );\n}\n","import { IntlProvider } from 'react-intl';\nimport { LOCALE } from '../data/constants';\nimport { useMessages } from '../hooks/useMessages';\nimport { StyledMainContent } from './App.styles';\nimport { WidgetContainer } from './organisms/WidgetContainer/WidgetContainer';\n\nexport default function App(): JSX.Element | null {\n const messages = useMessages();\n\n if (!messages) {\n return null;\n }\n\n return (\n <>\n <IntlProvider locale={LOCALE} defaultLocale=\"en\" messages={messages}>\n <StyledMainContent>\n <WidgetContainer />\n </StyledMainContent>\n </IntlProvider>\n </>\n );\n}\n","import { useEffect, useState } from 'react';\n\nexport const useMessages = (): Record<string, string> | undefined => {\n const [message, setMessages] = useState<Record<string, string>>();\n\n useEffect(() => {\n (async () => {\n const response = await fetch('/messages/default.json');\n try {\n const data = await response.json();\n setMessages(data);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n })();\n }, []);\n\n return message;\n};\n","import type { ReportHandler } from 'web-vitals';\n\nexport default async function reportWebVitals(onPerfEntry?: ReportHandler): Promise<void> {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { getCLS, getFID, getFCP, getLCP, getTTFB } = await import('web-vitals');\n\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n }\n}\n","import { normalize, size } from 'polished';\nimport { createGlobalStyle } from 'styled-components';\nimport { typeStyle } from './typeStyle';\nimport { FontFamily } from './variables';\n\nexport const GlobalStyle = createGlobalStyle`\n ${normalize()}\n\n html {\n box-sizing: border-box;\n font-family: ${FontFamily.Arial};\n color: ${({ theme }) => theme.color.black};\n -webkit-text-size-adjust: 100%;\n overscroll-behavior-x: contain;\n }\n\n body {\n ${typeStyle.normal};\n margin: 0;\n }\n\n html, body {\n ${size('100%')};\n }\n\n *,\n *:before,\n *:after {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-sizing: inherit;\n }\n\n a {\n color: currentColor;\n text-decoration: none;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n p {\n font-weight: normal;\n margin: 0;\n }\n\n ul,\n ol, li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n button,\n input {\n padding: 0;\n outline: 0;\n border: none;\n background: none;\n }\n\n #root {\n height: 100%;\n }\n\n .simplebar-scrollbar:before {\n width: 0.3125rem;\n background: ${({ theme }) => theme.color.lighterGrey};\n border-radius: 0;\n left: 0.3125rem;\n right: 0;\n border-radius: ${({ theme }) => theme.defaultCssProps.borderRadius.normal};\n }\n\n .simplebar-scrollbar.simplebar-visible:before {\n opacity: 1;\n }\n\n .mapboxgl-ctrl-bottom-right{\n z-index: 5;\n }\n\n .mapboxgl-ctrl-bottom-left{\n z-index: 2;\n }\n\n`;\n","import { StrictMode } from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport { ThemeProvider } from 'styled-components';\nimport App from './components/App';\nimport reportWebVitals from './reportWebVitals';\nimport { GlobalStyle } from './styles/GlobalStyle';\nimport { theme } from './styles/theme/default';\nimport 'simplebar/dist/simplebar.min.css';\nimport './utils/lazysizes';\n\n/** RENDER */\nReactDOM.render(\n <StrictMode>\n <BrowserRouter>\n <ThemeProvider theme={theme}>\n <>\n <GlobalStyle />\n <App />\n </>\n </ThemeProvider>\n </BrowserRouter>\n </StrictMode>,\n // eslint-disable-next-line unicorn/prefer-query-selector\n document.getElementById('root'),\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}