{"version":3,"file":"static/chunks/7816-24721800e08ef2ef.js","mappings":"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","sources":["webpack://_N_E/?b094","webpack://_N_E/./app/lib/utils/clientComponentCookieHelper.ts","webpack://_N_E/./app/weather-forecast/_components/forecastErrorUI/error.tsx","webpack://_N_E/./lib/services/forecastDataService/weatherForecastDataService/constants.ts","webpack://_N_E/./components/utilities/dateTimeUtils.ts","webpack://_N_E/./app/lib/utils/forecastUtils.ts","webpack://_N_E/./app/weather-forecast/_components/almanacHourlyListItem/sunriseSunsetHourlyListItem.tsx","webpack://_N_E/./lib/utils/unitsHelpers/unitsHelpers.ts","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/details/hourly/hourlyForecastDetailItem.tsx","webpack://_N_E/./components/elements/icons/weatherForecastIcon/constants.ts","webpack://_N_E/./components/elements/icons/weatherForecastIcon/weatherForecastIcon.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/commonStyles.ts","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/hourly/dateDisplay.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/hourly/temperatureDisplay.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/hourly/hourlyDisclosureSummaryDetails.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/hourlyForecastDisclosureListItem.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastList/hourly/hourlyForecastList.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/details/tenDay/tenDayForecastDetailItem.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/details/tenDay/tenDayForecastDetailItemLink.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/details/tenDay/tenDayForecastDisclosureDayNightDetails.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/tenDay/dateDisplay.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/tenDay/highLowDisplay.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/summary/tenDay/tenDayDisclosureSummaryDetails.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastDisclosureListItem/forecastDisclosureListItem.tsx","webpack://_N_E/./app/weather-forecast/_components/weekendBoundary/weekendBoundary.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastList/tenDay/tenDayForecastList.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastPageDateHeader/tenDay/tenDayForecastPageDateHeader.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastPageHeader/forecastPageHeader.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastSectionContent/hourlyForecastSectionContent.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastSectionContent/tenDayForecastSectionContent.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastSubNavigation/hourlyForecastDayNavigation.tsx","webpack://_N_E/./app/weather-forecast/_components/forecastLayoutWrapper/forecastDetailsWrapper.tsx"],"sourcesContent":["import(/* webpackMode: \"eager\", webpackExports: [\"ForecastDetailsWrapper\"] */ \"/data/core/workspace/therBug_WeatherBugWebsite_master/Projects/Wb.Web.WeatherBug.Webapp/src/Wb.Web.WeatherBug.Webapp/app/weather-forecast/_components/forecastLayoutWrapper/forecastDetailsWrapper.tsx\");\n","import { setCookie } from 'cookies-next';\n\nexport function getDomain() {\n const hostname = window.location.hostname;\n\n if (hostname.includes('weatherbug.com')) {\n return '.weatherbug.com';\n }\n\n if (hostname.includes('weatherbugsc.com')) {\n return '.weatherbugsc.com';\n }\n\n // local host:\n if (hostname === 'localhost') {\n return 'localhost';\n }\n\n return undefined;\n}\n\nexport function setCookieOnClient(cookieName: string, cookieValue: string, expirationDate?: Date) {\n setCookie(cookieName, cookieValue, {\n domain: getDomain(),\n httpOnly: false,\n path: '/',\n expires: expirationDate\n });\n}\n","import styled from 'styled-components';\nimport { DisplayAdWidgetWrapper } from '../../../../components/modules/ads/displayAds/widget/displayAdWidgetWrapper';\nimport { GenericError, GenericErrorProps } from '../../../lib/errorUIs/generic/error';\n\ntype ErrorProps = GenericErrorProps & {\n adSlotId?: string;\n};\n\nexport const Error = ({ title, description, adSlotId }: ErrorProps) => {\n return (\n \n \n \n \n \n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n gap: 1rem;\n`;\n\nconst AdContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n width: 100%;\n height: auto;\n min-height: 250px;\n`;\n","import { entityManagementSettingValues, PrecipitationRateUnit } from '../../../utils/common/constants';\nimport { type SpecificUnits } from '../../../utils/unitsHelpers/types';\n\nexport const WEATHER_FORECAST_ROUNDING_PROFILES = {\n None: 'none', // values returned as is without any rounding\n Precise: 'precise', // all values are rounded to 4 decimal places\n DisplayLegacyV1: 'displayLegacyV1', // implements rounding approach used by the API before adding 'rounding' parameter\n DisplayV1: 'displayV1' // implements rounding approach to produce values with precision required to display values on UI in client applications\n} as const;\n\nexport const DAILY_WEATHER_FORECAST_V5_API_ENDPOINT = 'api/for/daily/v5';\nexport const HOURLY_WEATHER_FORECAST_V6_API_ENDPOINT = 'api/for/hourly/v6';\nexport const DEFAULT_ICON_CODE = 999;\nexport const DEFAULT_HOURLY_FORECAST_OFFSET = 0;\nexport const DEFAULT_HOURLY_FORECAST_LENGTH = 144;\n\nexport const DEFAULT_SPECIFIC_UNITS: SpecificUnits = {\n DirectionUnit: entityManagementSettingValues.DirectionUnit.degree,\n DistanceUnit: entityManagementSettingValues.DistanceUnit.miles,\n SpeedUnit: entityManagementSettingValues.SpeedUnit.milesPerHour,\n PrecipitationRateUnit: PrecipitationRateUnit.InchesPerHour,\n PrecipitationUnit: entityManagementSettingValues.PrecipitationUnit.inches,\n TemperatureUnit: entityManagementSettingValues.TemperatureUnit.fahrenheit,\n PressureUnit: entityManagementSettingValues.PressureUnit.inchesOfMercury\n};\n","import { DateTime, DateTimeUnit, DurationObjectUnits } from 'luxon';\n\nexport const convertUnixTimeStampToDate = (timestamp: number, format: string): string => {\n try {\n const dateTimeFromTS = DateTime.fromMillis(timestamp);\n const formattedDateTimeStr = dateTimeFromTS.toFormat(format);\n return formattedDateTimeStr;\n } catch (error) {\n console.error('Error converting Unix timestamp to formatted date time string ---> ', error);\n return '';\n }\n};\n\nexport const parseAndFormatISO8601DateStr = (\n isoDateStr: string,\n format: string,\n setZone = true,\n timezone?: string\n): string => {\n try {\n let dateTime;\n\n if (setZone) {\n dateTime = DateTime.fromISO(isoDateStr, { setZone: setZone });\n } else if (timezone) {\n dateTime = DateTime.fromISO(isoDateStr).setZone(timezone);\n } else {\n dateTime = DateTime.fromISO(isoDateStr);\n }\n\n if (!dateTime?.isValid) {\n return '';\n }\n\n const formattedValidDateTime = dateTime.toFormat(format);\n return formattedValidDateTime;\n } catch (error) {\n console.error('Error parsing/formating ISO 8601 ---> ', error);\n return '';\n }\n};\n\ntype TimeUnit = keyof DurationObjectUnits;\n\n/**\n * This function calculates the difference between two dates in a specified unit.\n * @param startDateStr The start date\n * @param endDateStr The end date\n * @param unit the unit of time to calculate the difference in (seconds, minutes, hours, days, weeks, months, years).\n * @returns The difference between the two dates in the specified unit or an empty string if the input strings are invalid.\n */\nexport const calculateTimeDiffBetweenTwoDates = (\n startDate: string,\n endDate: string,\n timeUnit: TimeUnit\n): number | undefined => {\n try {\n const startTime = parseIsoDateToDateTimeObject(startDate);\n const endTime = parseIsoDateToDateTimeObject(endDate);\n const diff = startTime ? endTime?.diff(startTime, timeUnit).toObject() : null;\n\n if (diff && Number.isFinite(diff?.[timeUnit])) {\n return Math.floor(diff[timeUnit] as number);\n }\n return;\n } catch (error) {\n console.error('Error calculating the diff between two dates ---> ', error);\n return;\n }\n};\n\n/**\n * This function parses a custom date/time by first creating a DateTime instance using the local time,then changes the instances\n * timezone to utc without adjusting the values of the hours,minutes, and seconds.\n * @param customDateString - The custom date string to parse\n * @param formatStr - The format to parse the custom date string to\n * @returns The ISO 8601 Date string, or an null should parsing fail.\n */\nexport const parseCustomDateString = (customDateString: string, formatStr: string): string | null => {\n try {\n const dateTime = DateTime.fromFormat(customDateString, formatStr).setZone('utc');\n\n if (!dateTime.isValid) {\n return null;\n }\n return dateTime.toISO();\n } catch (error) {\n console.error('Failed to parse custom date str ---> ', error);\n return null;\n }\n};\n\n/**\n * This function creates an DateTime Object from ISO date/time strings.\n * @param isoDateStr - The ISO 8601 date string\n * @returns A Luxon DateTime object\n */\nexport const parseIsoDateToDateTimeObject = (isoDateStr: string): DateTime | undefined => {\n try {\n const dateTimeObj = DateTime.fromISO(isoDateStr);\n return dateTimeObj;\n } catch (error) {\n console.error('Error Parsing ISO date string to DateTime Object --->', error);\n return;\n }\n};\n\n/**\n * This function takes a Unix timestamp in sec and converts to an ISO 8601 string.\n *\n * @param unixTimeStamp - The Unix timestamp (sec) to be converted.\n * @returns An ISO 8601 string representation of the input Unix timestamp in UTC.\n */\nexport const convertUnixToISOString = (unixTimeStamp: number): string | null => {\n try {\n const dateObjFromTS = DateTime.fromSeconds(unixTimeStamp);\n const utcDateTime = dateObjFromTS.toUTC();\n const dateIsoString = utcDateTime.toISO();\n\n return dateIsoString;\n } catch (error) {\n console.error('Error Converting Unix timestamp to ISO string --->', error);\n return null;\n }\n};\n\n/**\n * This function takes a Unix timestamp in milliseconds and converts to human readable time string e.g 2 days ago, 5 hours ago etc.\n *\n * @param unixTimestamp - The Unix timestamp (in milliseconds).\n * @returns A human readable string that represents the time between the input unixTimestamp and the current time.\n */\nexport const convertUnixTimeStampToRelativeTime = (unixTimestamp: number): string | null => {\n try {\n const dateTime = DateTime.fromMillis(unixTimestamp);\n\n // adjust both the input unixTimestamp and the current time to the local equivalents.\n const humanReadableRelativeTimeStr = dateTime.toRelative({ base: DateTime.now() });\n return humanReadableRelativeTimeStr;\n } catch (error) {\n console.error('Error Converting Unix timestamp to Human readable relative time string --->', error);\n return null;\n }\n};\n\n/**\n * This function two ISO date strings and determines if they have the same DateTime unit.\n *\n * @param currDateStr - The first ISO date string to compare.\n * @param nextDateStr - The second ISO date string to compare.\n * @param unit - The unit of time to compare i.e 'minute', 'hour', 'day' etc. The default for this param is 'day'\n * @returns a boolean if the two ISO date strings have the same unit.\n */\nexport const isSameDateTimeUnit = (\n currDateStr: string,\n nextDateStr: string,\n dateTimeUnit: DateTimeUnit = 'day'\n): boolean => {\n try {\n const currDateObj = parseIsoDateToDateTimeObject(currDateStr);\n const nextDateObj = parseIsoDateToDateTimeObject(nextDateStr);\n\n if (currDateObj?.isValid && nextDateObj?.isValid) {\n return currDateObj.hasSame(nextDateObj, dateTimeUnit);\n }\n return false;\n } catch (error) {\n console.error('Error Comparing if date strings have same unit --->', error);\n return false;\n }\n};\n\n/**\n * This function formats the current date using the input date format string.\n * @param formatStr - The format string to format the current date to.\n * @returns formatted current date string or null if there's an error.\n */\nexport const formatCurrentDate = (formatStr: string): string | null => {\n try {\n return DateTime.now().toFormat(formatStr);\n } catch (error) {\n console.error('Error formatting current date string', error);\n return null;\n }\n};\n\n/**\n * This function parses a custom date/time string by first creating a DateTime instance using the local time zone (browser/system), then converts the instance\n * to UTC, preserving the same point in time in the UTC time zone\n * @param customDateTimeStr - The date/time string input to format\n * @param customDateFormat - The format of customDateTimeStr param that will be used when parsing the param\n * @returns the UTC DateTime instance of the customDateTimeStr\n */\nexport const parseCustomDateTimeToUTC = (customDateTimeStr: string, customDateFormat: string): DateTime | null => {\n try {\n return DateTime.fromFormat(customDateTimeStr, customDateFormat).toUTC();\n } catch (error) {\n console.error('Error parsing custom date to UTC', error);\n return null;\n }\n};\n\n/**\n * Parses the given ISO date string and returns the weekday number: Monday = 1, Tuesday = 2 etc\n */\nexport function getWeekday(isoDateTimeStr: string) {\n return DateTime.fromISO(isoDateTimeStr).weekday;\n}\n","/* eslint-disable @typescript-eslint/member-delimiter-style */\n/* eslint-disable operator-linebreak */\nimport { DateTime } from 'luxon';\nimport { getWeekday } from '../../../components/utilities/dateTimeUtils';\nimport { SolarV2CompactType } from '../../../lib/services/forecastDataService/almanacDataService/types';\nimport { DEFAULT_ICON_CODE } from '../../../lib/services/forecastDataService/weatherForecastDataService/constants';\nimport {\n HourlyForecastPeriodV3,\n type DailyForecastPeriodLegacyCompactType\n} from '../../../lib/services/forecastDataService/weatherForecastDataService/types';\nimport { isValidNumber, isValidString } from '../../../lib/utils/guardUtils/guardUtils';\nimport { UserType } from '../../../store/userStore/types';\nimport {\n type DailyForecastDataGroup,\n type DayForecastItemType,\n type RenderableDailyForecastListItem\n} from '../../weather-forecast/_utils/types';\nimport { DAY_TEXT, DEFAULT_FORECAST_VALUE, NIGHT_TEXT, TODAY_TEXT, TONIGHT_TEXT } from './constants';\n\nexport const generateLowHighDisplay = (temp?: number) => {\n let displayTemp = DEFAULT_FORECAST_VALUE;\n\n if (isValidNumber(temp)) {\n displayTemp = `${temp}`;\n }\n\n return `${displayTemp}`;\n};\n\nexport const generateDayNightDisplayText = (isNight?: boolean, isToday?: boolean) => {\n if (isNight && isToday) {\n return TONIGHT_TEXT;\n }\n\n if (isNight) {\n return NIGHT_TEXT;\n }\n\n if (isToday) {\n return TODAY_TEXT;\n }\n\n return DAY_TEXT;\n};\n\nexport const dailyHeaderDateFormat = 'ccc, LLL. d';\nexport const hourlyHeaderDateFormat = 'h:mm a';\n\nexport const generateIconURLFromTemplate = (iconCode: number, forecastIconUrlTemplate: string): string => {\n const iconURL = forecastIconUrlTemplate?.replace('{iconCode}', `${iconCode}`);\n return iconURL;\n};\n\n/**\n * Creates forecast groups fromt the raw data.\n *\n * - If the first item is night time i.e intp = true, that forms a single-item group.\n * - Subsequent daily forecast items are grouped in pairs (usually day/night pairs).\n * @param rawAPIData The array of daily forecast data from the API.\n * @returns An Array of forecast groups, where each group is one or two items of original data from the API\n */\nexport function createDailyForecastListItemGroupsFromAPIData(\n rawAPIData: Array,\n forecastIconUrlTemplate: string\n): Array {\n const dailyForecastListItemGroups: Array = [];\n let currentIndex = 0;\n\n if (!rawAPIData?.length) {\n return dailyForecastListItemGroups;\n }\n\n // Handle the first itme if it's night time\n if (rawAPIData[0].intp) {\n dailyForecastListItemGroups.push([\n {\n ...rawAPIData[0],\n isToday: true,\n iconURL: generateIconURLFromTemplate(rawAPIData[0]?.ic ?? DEFAULT_ICON_CODE, forecastIconUrlTemplate)\n }\n ]);\n currentIndex = 1;\n } else {\n // Form the first pair and mark them as isToday=true\n if (rawAPIData.length > 1) {\n const day1: DayForecastItemType = {\n ...rawAPIData[0],\n isToday: true,\n iconURL: generateIconURLFromTemplate(rawAPIData[0]?.ic ?? DEFAULT_ICON_CODE, forecastIconUrlTemplate)\n };\n const night1: DayForecastItemType = {\n ...rawAPIData[1],\n isToday: true,\n iconURL: generateIconURLFromTemplate(rawAPIData[1]?.ic ?? DEFAULT_ICON_CODE, forecastIconUrlTemplate)\n };\n dailyForecastListItemGroups.push([day1, night1]);\n currentIndex = 2;\n } else if (rawAPIData.length === 1) {\n // Only one item in total and it's not night-time - just mark it as isToday\n dailyForecastListItemGroups.push([\n {\n ...rawAPIData[0],\n isToday: true,\n iconURL: generateIconURLFromTemplate(\n rawAPIData[0]?.ic ?? DEFAULT_ICON_CODE,\n forecastIconUrlTemplate\n )\n }\n ]);\n\n currentIndex = 1;\n }\n }\n\n // pair the remaining items into groups of two without setting isToday\n while (currentIndex < rawAPIData.length) {\n const firstForecastItemForGroup = rawAPIData[currentIndex];\n const dayTime: DayForecastItemType = {\n ...firstForecastItemForGroup,\n isToday: false,\n iconURL: generateIconURLFromTemplate(\n rawAPIData[currentIndex]?.ic ?? DEFAULT_ICON_CODE,\n forecastIconUrlTemplate\n )\n };\n\n if (currentIndex + 1 < rawAPIData.length) {\n const secondForecastItemForGroup = rawAPIData[currentIndex + 1];\n const nightTime: DayForecastItemType = {\n ...secondForecastItemForGroup,\n isToday: false,\n iconURL: generateIconURLFromTemplate(\n rawAPIData[currentIndex + 1]?.ic ?? DEFAULT_ICON_CODE,\n forecastIconUrlTemplate\n )\n };\n\n dailyForecastListItemGroups.push([dayTime, nightTime]);\n currentIndex += 2;\n } else {\n // last single item\n dailyForecastListItemGroups.push([dayTime]);\n currentIndex += 1;\n }\n }\n\n return dailyForecastListItemGroups;\n}\n\n/**\n * Generates a Rendereable Daily Forecast list UI data by inserting weekend separators and an ad into the forecast groups.\n *\n * - Inserts a weekend start separator before the first saturday forecast that follows a non-weekend day.\n * - Inserts a weekend end separator after Sunday if the next forecast group is not a weekend day or if it's the end.\n * - Inserts an ad after the 4th forcast group (not counting separators).\n * @param dailyForecastDataGroup the array of forecast groups - Array\n * @returns a new array of RenderableDailyForecastListItem that includes DailyForecastDataGroup, weekend seperators and a single ad.\n */\nexport function generateRenderableDailyForecastListUIData(\n dailyForecastDataGroup: Array\n): Array {\n const result: Array = [];\n let lastGroupWeekday: number | null = null;\n let forecastCount = 0; // counts how many forecast groups have been inserted (not separators)\n\n for (let index = 0; index < dailyForecastDataGroup.length; index++) {\n const group = dailyForecastDataGroup[index];\n const currentDayOfWeek = getWeekday(group[0].fdls);\n\n // Weekend days:\n // Saturday = 6;\n // Sunday = 7;\n\n // If this is a Saturday and previous group was not a weekend day, start weekend\n const isCurrentSaturday = currentDayOfWeek === 6;\n const wasLastWeekend = lastGroupWeekday === 6 || lastGroupWeekday === 7;\n\n if (isCurrentSaturday && !wasLastWeekend) {\n result.push({\n type: 'weekendSeparator',\n position: 'start'\n });\n }\n\n // Add the forecast group\n result.push({\n type: 'forecast',\n item: group,\n forecastIndex: index\n });\n forecastCount++;\n\n // check if we need to end the weekend\n // If today is Sunday (7), end weekend if nextday is nextday is not weekend or no more groups\n if (currentDayOfWeek === 7) {\n const nextGroup = dailyForecastDataGroup[index + 1];\n if (!nextGroup) {\n // No next group: end the weekend at the end of the data\n result.push({\n type: 'weekendSeparator',\n position: 'end'\n });\n } else {\n const nextDay = getWeekday(nextGroup[0].fdls);\n if (nextDay !== 6 && nextDay !== 7) {\n // end weekend here, next day is not weekend\n result.push({\n type: 'weekendSeparator',\n position: 'end'\n });\n }\n }\n }\n\n // Insert ad after the 4th forecast item if not done yet\n if (forecastCount === 4) {\n result.push({\n type: 'ad'\n });\n }\n lastGroupWeekday = currentDayOfWeek;\n }\n\n return result;\n}\n\n/**\n * This function generates the latlng string used API call to retrieve weather forecast\n */\nexport function getForecastLatLngStrFromUser(user: UserType) {\n if (!user?.ActiveLocation) {\n return '';\n }\n\n // return station lat/lng instead so forecast is based on the station closest to the user\n if (user.ActiveLocation?.Station) {\n if (\n Number.isFinite(user.ActiveLocation.Station.Latitude) &&\n Number.isFinite(user.ActiveLocation.Station.Longitude)\n ) {\n return `${user.ActiveLocation.Station.Latitude},${user.ActiveLocation.Station.Longitude}`;\n }\n }\n\n // No station for the location, lets use the locality's lat/lng instead so forecast is based on that.\n if (user.ActiveLocation?.Locality) {\n if (\n Number.isFinite(user.ActiveLocation.Locality.Latitude) &&\n Number.isFinite(user.ActiveLocation.Locality.Longitude)\n ) {\n return `${user.ActiveLocation.Locality?.Latitude},${user.ActiveLocation.Locality?.Longitude}`;\n }\n }\n\n return '';\n}\n\nexport function getDayForecastItemHourCardSlug(\n forecastDateLocalStr: string,\n enableNewHourlyForecastLinksOn10DayPage?: boolean\n) {\n if (!isValidString(forecastDateLocalStr)) {\n return;\n }\n const dateTimeObj = DateTime.fromISO(forecastDateLocalStr, { setZone: true });\n\n if (!dateTimeObj?.isValid) {\n return;\n }\n\n if (enableNewHourlyForecastLinksOn10DayPage) {\n return dateTimeObj?.toFormat('yyyyMMdd');\n }\n\n return dateTimeObj?.toFormat('yyyyMMddhh');\n}\n\nexport function processHourlyForecastData(\n hourlyForecastPeriods: Array,\n dayParam: string | null = null\n) {\n const todayForecastDate = DateTime.fromISO(hourlyForecastPeriods[0].fdtolcl, { setZone: true });\n\n const uniqueDaysMapForNavigation = new Map<\n string,\n {\n formattedUnSelectedNavDateDisplay: string;\n formattedSelectedNavDateDisplay: string;\n dateQueryParam: string;\n isToday: boolean;\n }\n >();\n\n for (let index = 0; index < hourlyForecastPeriods.length; index++) {\n const isToday = index === 0;\n const forecast = hourlyForecastPeriods[index];\n const forecastDate = DateTime.fromISO(forecast.fdtolcl, { setZone: true });\n const dateKey = forecastDate?.toFormat('yyyyMMdd');\n\n if (dateKey && forecastDate && !uniqueDaysMapForNavigation.has(dateKey)) {\n uniqueDaysMapForNavigation.set(dateKey, {\n formattedUnSelectedNavDateDisplay: forecastDate?.toFormat('EEE'),\n formattedSelectedNavDateDisplay: forecastDate?.toFormat('ccc, MMM d'),\n dateQueryParam: dateKey,\n isToday\n });\n }\n }\n\n const navigationDays = Array.from(uniqueDaysMapForNavigation.values());\n\n const targetDay = dayParam || todayForecastDate?.toFormat('yyyyMMdd');\n\n const isValidDay = navigationDays.some((navDay) => navDay.dateQueryParam === targetDay);\n\n const dayToFilterKey = isValidDay ? targetDay : navigationDays[0].dateQueryParam;\n\n const filteredDayHourlyForecastList = hourlyForecastPeriods.filter((hourlyPeriod) => {\n const hourlyPeriodDate = DateTime.fromISO(hourlyPeriod.fdtolcl, { setZone: true });\n const dateKey = hourlyPeriodDate?.toFormat('yyyyMMdd');\n return dayToFilterKey === dateKey;\n });\n\n const activeDayIndex = navigationDays.findIndex((navDay) => navDay.dateQueryParam === dayToFilterKey);\n\n return {\n navigationDays,\n activeDay: {\n ...navigationDays[activeDayIndex],\n activeDayIndex,\n filteredDayHourlyForecastList\n }\n };\n}\n\nexport function shouldShowSunriseOrSunset(hourlyCardDate: string, solarDate?: string): boolean {\n let shouldShow = false;\n\n if (!solarDate) {\n return shouldShow;\n }\n\n const hourlyCardTime = DateTime.fromISO(hourlyCardDate, { setZone: true });\n\n if (solarDate) {\n const sunriseTime = DateTime.fromISO(solarDate, { setZone: true });\n\n const nextHourAfterSunsrise = sunriseTime.plus({ hours: 1 }).startOf('hour');\n\n if (hourlyCardTime.hour === nextHourAfterSunsrise.hour) {\n shouldShow = true;\n }\n }\n return shouldShow;\n}\n\nexport function shouldShowHourlyDetailsLinkOnDailyItem(dayItemIndex: number, firstItemIsNightTimePeriod?: boolean) {\n // We have a maximum of 144hourly forecast items which is 24hrs x 6 days of hourly forecasts data\n // If the first index a night time period card only, it implies there may be hourly forecast for the 7th day on the hourly page,\n // and the 7th day may not have up to 24hours of hourly forecasts, so must take that into consideration.\n\n if (dayItemIndex <= 5) {\n return true;\n }\n\n if (dayItemIndex === 6 && firstItemIsNightTimePeriod) {\n return true;\n }\n\n if (dayItemIndex > 6) {\n return false;\n }\n\n return false;\n}\n\nexport function getAlmanacDataByHourlyQuery(\n selectedHourlyDayQueryParam?: string,\n solarDataForecast?: Array\n): SolarV2CompactType | undefined {\n if (!selectedHourlyDayQueryParam || !solarDataForecast?.length) {\n return;\n }\n\n const solarItem = solarDataForecast?.find((solarItem) => {\n if (solarItem?.srdtolcl) {\n const solarPeriodDate = DateTime.fromISO(solarItem.srdtolcl, { setZone: true });\n const dateKey = solarPeriodDate?.toFormat('yyyyMMdd');\n return dateKey === selectedHourlyDayQueryParam;\n }\n return false;\n });\n\n return solarItem;\n}\n","import Image from 'next/image';\nimport styled from 'styled-components';\n\ntype SunriseHourlyListItemProps = {\n sunriseLocalDateIsoString?: string;\n sunriseDisplayString?: string;\n sunsetLocalDateIsoString?: string;\n sunsetDisplayString?: string;\n};\n\nexport const SunriseSunsetHourlyListItem = ({\n sunriseDisplayString,\n sunriseLocalDateIsoString,\n sunsetDisplayString,\n sunsetLocalDateIsoString\n}: SunriseHourlyListItemProps) => {\n if (sunriseDisplayString) {\n return (\n \n Sunrise\n {sunriseDisplayString}\n \n );\n }\n\n if (sunsetDisplayString) {\n return (\n \n Sunset\n {sunsetDisplayString}\n \n );\n }\n\n return null;\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 7px;\n height: 65px;\n`;\n\nconst SunriseSunsetTime = styled.time`\n display: flex;\n flex-direction: row;\n justify-content: center;\n color: ${({ theme }) => theme.colors.base};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.9375rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.25rem;\n`;\n","/**\n * TODO: revisit the approach used in determining unit types here.\n * We should use the approach in commonjs.\n * At this phase of the migration, we are trying not introduce tons of differences in data between web 1 and web 2.\n */\n\nimport { type UserType } from '../../../store/userStore/types';\nimport {\n entityManagementSettingValues,\n PrecipitationRateUnit,\n pressureUnits,\n temperatureUnits,\n unitSystemType,\n windUnits\n} from '../common/constants';\nimport { type SpecificUnits } from './types';\n\n/**\n * Get the unit type\n */\nexport const getUnitType = (unitTypeValue: number) => {\n switch (unitTypeValue) {\n case 1:\n default:\n return 'English';\n case 2:\n return 'Metric';\n }\n};\n\nexport const getPressureUnitType = (pressureTypeValue: number) => {\n switch (pressureTypeValue) {\n case 1:\n default:\n return 'Inches';\n case 2:\n return 'mb';\n }\n};\n\nexport const getTempUnitType = (tempTypeValue: number) => {\n switch (tempTypeValue) {\n case 1:\n default:\n return 'Fahrenheit';\n case 2:\n return 'Celsius';\n }\n};\n\nexport const getWindUnit = (windValue: number) => {\n switch (windValue) {\n case 1:\n default:\n return 'm/h';\n case 2:\n return 'km/h';\n case 3:\n return 'Knots';\n case 4:\n return 'm/s';\n }\n};\n\nexport const getUnitSystemOrTempUnitNum = (unitSystemOrTempUnit: string) => {\n switch (unitSystemOrTempUnit) {\n case 'english':\n default:\n return 1;\n case 'metric':\n return 2;\n }\n};\n\nexport const getWindUnitNum = (windUnitStr: string) => {\n switch (windUnitStr) {\n case 'm/h':\n default:\n return 1;\n case 'km/h':\n return 2;\n case 'Knots':\n return 3;\n case 'm/s':\n return 4;\n }\n};\n\nexport const getPressureUnitNum = (pressureUnit: string) => {\n switch (pressureUnit) {\n case 'inches':\n default:\n return 1;\n case 'millibars':\n return 2;\n }\n};\n\nexport const getPressureUnitNumFromEmSetting = (pressureUnit: string) => {\n switch (pressureUnit) {\n case 'inches':\n default:\n return 1;\n case 'mb':\n return 2;\n }\n};\n\nexport const getDistanceUnit = (distantUnitEnum: number | undefined) => {\n switch (distantUnitEnum) {\n case 1:\n default:\n return 'miles';\n case 2:\n return 'kilometers';\n }\n};\n\nexport const getSpeedUnit = (speedUnitEnum: number | undefined) => {\n switch (speedUnitEnum) {\n case 1:\n default:\n return 'mph';\n case 2:\n return 'kph';\n case 3:\n return 'knots';\n case 4:\n return 'mps';\n }\n};\n\nexport const getPressureUnit = (pressureUnitEnum: number | undefined) => {\n switch (pressureUnitEnum) {\n case 1:\n default:\n return 'inHg';\n case 2:\n return 'mb';\n }\n};\n\nexport const getWindDirection = (windDirectionDegrees: number) => {\n if (typeof windDirectionDegrees !== 'number') {\n return null;\n }\n // Insure direction is between 0 and 360\n // TODO 9.17.24: this is old code and may not be necessary anymore.\n // Dima recommends replacing these two line with \"windDirectionDegrees %= 360;\"\n // while (0 > windDirectionDegrees) windDirectionDegrees += 360;\n // while (359 < windDirectionDegrees) windDirectionDegrees -= 360;\n\n windDirectionDegrees /= 22.5;\n\n switch (Math.round(windDirectionDegrees)) {\n case 1:\n return 'NNE';\n case 2:\n return 'NE';\n case 3:\n return 'ENE';\n case 4:\n return 'E';\n case 5:\n return 'ESE';\n case 6:\n return 'SE';\n case 7:\n return 'SSE';\n case 8:\n return 'S';\n case 9:\n return 'SSW';\n case 10:\n return 'SW';\n case 11:\n return 'WSW';\n case 12:\n return 'W';\n case 13:\n return 'WNW';\n case 14:\n return 'NW';\n case 15:\n return 'NNW';\n default: // 0, 16\n return 'N';\n }\n};\n\nexport function deriveUserSpecificUnits(user: UserType): SpecificUnits {\n // TechDebt: DirectionUnit is not supported or required on Web - Default value will be used */\n const DirectionUnit = entityManagementSettingValues.DirectionUnit.degree;\n // TechDebt: Web user settings currently doesn't support DistanceUnit\n // Hence, we are using User.Units with values, 1 | 2; where\n // 1 == UnitType.English, this will be mapped to DistanceUnit in Miles (mi)\n // 2 == UnitType.Metric, this will be mapped to DistanceUnit in Kilometers (km)\n const DistanceUnit = mapUserUnitToDistanceUnit(user?.Units as typeof unitSystemType[keyof typeof unitSystemType]);\n const SpeedUnit = mapUserWindUnitToSpeedUnit(user?.WindUnit as typeof windUnits[keyof typeof windUnits]);\n\n // TechDebt: Web user settings currently doesn't support PrecipitationRateUnit\n // Hence, we are using User.Units with values, 1 | 2; where\n // 1 == UnitType.English, this will be mapped to PrecipitationRateUnit in InchesPerHour (inph)\n // 2 == UnitType.Metric, this will be mapped to PrecipitationRateUnit in MillimetersPerHour (mmph)\n const PrecipitationRateUnit = mapUserUnitToPrecipitationRateUnit(\n user?.Units as typeof unitSystemType[keyof typeof unitSystemType]\n );\n\n // TechDebt: Web user settings currently doesn't support Precipitation unit\n // Hence, we are using User.Units with values, 1 | 2; where\n // 1 == UnitType.English, this will be mapped to PrecipitationUnit in Inches (in)\n // 2 == UnitType.Metric, this will be mapped to PrecipitationUnit in Millimeters (mm)\n const PrecipitationUnit = mapUserUnitToPrecipitationUnit(\n user?.Units as typeof unitSystemType[keyof typeof unitSystemType]\n );\n\n const TemperatureUnit = mapUserTemperatureUnitToTemperatureUnit(\n user?.TempUnit as typeof temperatureUnits[keyof typeof temperatureUnits]\n );\n const PressureUnit = mapUserPressureUnitToPressureUnit(\n user?.PressureUnit as typeof pressureUnits[keyof typeof pressureUnits]\n );\n\n return {\n DirectionUnit,\n DistanceUnit,\n SpeedUnit,\n PrecipitationRateUnit,\n PrecipitationUnit,\n TemperatureUnit,\n PressureUnit\n };\n}\n\nexport function mapUserWindUnitToSpeedUnit(speedUnit: typeof windUnits[keyof typeof windUnits]) {\n switch (speedUnit) {\n case windUnits.knots: {\n return entityManagementSettingValues.SpeedUnit.knots;\n }\n\n case windUnits.kph: {\n return entityManagementSettingValues.SpeedUnit.kilometresPerHour;\n }\n\n case windUnits.mps: {\n return entityManagementSettingValues.SpeedUnit.milesPerSecond;\n }\n\n case windUnits.mph:\n default: {\n return entityManagementSettingValues.SpeedUnit.milesPerHour;\n }\n }\n}\n\nexport function mapUserTemperatureUnitToTemperatureUnit(\n temperatureUnit: typeof temperatureUnits[keyof typeof temperatureUnits]\n) {\n switch (temperatureUnit) {\n case temperatureUnits.celsius: {\n return entityManagementSettingValues.TemperatureUnit.celsius;\n }\n case temperatureUnits.fahrenheit:\n default: {\n return entityManagementSettingValues.TemperatureUnit.fahrenheit;\n }\n }\n}\n\nexport function mapUserPressureUnitToPressureUnit(pressureUnit: typeof pressureUnits[keyof typeof pressureUnits]) {\n switch (pressureUnit) {\n case pressureUnits.millibars: {\n return entityManagementSettingValues.PressureUnit.millibars;\n }\n case pressureUnits.inches:\n default: {\n return entityManagementSettingValues.PressureUnit.inchesOfMercury;\n }\n }\n}\n\nexport function mapUserUnitToPrecipitationUnit(precipitationUnit: typeof unitSystemType[keyof typeof unitSystemType]) {\n switch (precipitationUnit) {\n case unitSystemType.metric: {\n return entityManagementSettingValues.PrecipitationUnit.millimetre;\n }\n case unitSystemType.english:\n default: {\n return entityManagementSettingValues.PrecipitationUnit.inches;\n }\n }\n}\n\nexport function mapUserUnitToPrecipitationRateUnit(\n precipitationRateUnit: typeof unitSystemType[keyof typeof unitSystemType]\n) {\n switch (precipitationRateUnit) {\n case unitSystemType.metric: {\n return PrecipitationRateUnit.MillimetersPerHour;\n }\n case unitSystemType.english:\n default: {\n return PrecipitationRateUnit.InchesPerHour;\n }\n }\n}\n\nexport function mapUserUnitToDistanceUnit(distanceUnit: typeof unitSystemType[keyof typeof unitSystemType]) {\n switch (distanceUnit) {\n case unitSystemType.metric: {\n return entityManagementSettingValues.DistanceUnit.kilometre;\n }\n case unitSystemType.english:\n default: {\n return entityManagementSettingValues.DistanceUnit.miles;\n }\n }\n}\n\nexport function getTemperatureUnitFromRequestQuery(temperature?: string | null) {\n if (temperature === '2') {\n return temperatureUnits.celsius;\n }\n\n return temperatureUnits.fahrenheit;\n}\n\nexport function getPressureUnitFromRequestQuery(pressure?: string | null) {\n if (pressure === '2') {\n return pressureUnits.millibars;\n }\n\n return pressureUnits.inches;\n}\n\nexport function getWindSpeedUnitFromRequestQuery(windSpeed?: string | null) {\n if (windSpeed === '4') {\n return windUnits.mps;\n }\n\n if (windSpeed === '3') {\n return windUnits.knots;\n }\n\n if (windSpeed === '2') {\n return windUnits.kph;\n }\n\n if (windSpeed === '1') {\n return windUnits.mph;\n }\n\n return windUnits.mph;\n}\n","import styled from 'styled-components';\nimport { isValidNumber } from '../../../../../../lib/utils/guardUtils/guardUtils';\nimport { getWindDirection } from '../../../../../../lib/utils/unitsHelpers/unitsHelpers';\nimport { DEFAULT_FORECAST_VALUE } from '../../../../../lib/utils/constants';\n\ntype HourlyDisclosureDetailsProps = {\n feelsLikeTemperature?: number;\n relativeHumidity?: number;\n dewPointTemperature?: number;\n windDirection?: number;\n windSpeed?: number;\n};\n\nexport const HourlyDisclosureDetails = ({\n feelsLikeTemperature,\n relativeHumidity,\n dewPointTemperature,\n windDirection,\n windSpeed\n}: HourlyDisclosureDetailsProps) => {\n const feelsLikeDisplay = Number.isFinite(feelsLikeTemperature) ? feelsLikeTemperature : DEFAULT_FORECAST_VALUE;\n const relativeHumidityDisplay = Number.isFinite(relativeHumidity) ? `${relativeHumidity}%` : DEFAULT_FORECAST_VALUE;\n const dewPointTemperatureDisplay = Number.isFinite(dewPointTemperature)\n ? dewPointTemperature\n : DEFAULT_FORECAST_VALUE;\n const formattedWind = getWindDirection(windDirection as number);\n const windSpeedDisplay = Number.isFinite(windSpeed) ? windSpeed : DEFAULT_FORECAST_VALUE;\n const windDirectionAndSpeedDisplay = formattedWind ? `${formattedWind}${windSpeedDisplay}` : windSpeedDisplay;\n return (\n \n {/* Wind */}\n \n {windDirectionAndSpeedDisplay}\n Wind\n \n {/* Dew Point */}\n \n \n <>\n {dewPointTemperatureDisplay}\n {isValidNumber(dewPointTemperature) && °}\n \n \n Dew Point\n \n {/* Relative Humidity */}\n \n {relativeHumidityDisplay}\n Humidity\n \n {/* Feels like temperature */}\n \n \n <>\n {feelsLikeDisplay}\n {isValidNumber(feelsLikeTemperature) && °}\n \n \n Feels like\n \n \n );\n};\n\nconst ForecastDetailsWithLinkSection = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr 1fr 1fr 30px;\n grid-template-rows: 3.75rem;\n width: 100%;\n`;\n\nconst SubDetailContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n gap: 0.25rem;\n`;\n\nconst SubDetailData = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.25rem;\n`;\n\nconst SubDetailDataDescription = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.875rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1.25rem;\n`;\n\nconst DegreeSymbol = styled.sup`\n display: flex;\n`;\n","/* eslint-disable operator-linebreak */\nexport const base64BlurImageDataURL =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MCA4MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgODAgODAiPjxnPjxjaXJjbGUgY3g9IjQwIiBjeT0iNDAiIHI9IjQwIiBmaWxsPSIjMmU5OGUzIi8+PGc+PGc+PHBhdGggZD0ibTIxLjggNDYuM2wtMi44IDIuOGMtLjQuNC0uNCAxLjEgMCAxLjYuMi4yLjUuMy44LjMuMyAwIC42LS4xLjgtLjNsMi44LTIuOGMuNC0uNC40LTEuMSAwLTEuNi0uNC0uNS0xLjEtLjUtMS42IDAiIGZpbGw9IiNmZmJkMDMiLz48cGF0aCBkPSJtNDEuNyAyOS4yYy4zIDAgLjYtLjEuOC0uM2wyLjgtMi44Yy40LS40LjQtMS4xIDAtMS42LS40LS40LTEuMi0uNC0xLjYgMGwtMi44IDIuOGMtLjQuNC0uNCAxLjEgMCAxLjYuMi4yLjUuMy44LjMiIGZpbGw9IiNmZmJkMDMiLz48cGF0aCBkPSJtMjEuOCAyOC45Yy4yLjIuNS4zLjguMy4zIDAgLjYtLjEuOC0uMy40LS40LjQtMS4xIDAtMS42bC0yLjgtMi44Yy0uNC0uNC0xLjItLjQtMS42IDAtLjQuNC0uNCAxLjEgMCAxLjZsMi44IDIuOCIgZmlsbD0iI2ZmYmQwMyIvPjxwYXRoIGQ9Im0zMi4xIDI1LjFjLjYgMCAxLjItLjUgMS4yLTEuMXYtMy45YzAtLjYtLjYtMS4xLTEuMi0xLjEtLjYgMC0xLjIuNS0xLjIgMS4xdjMuOWMwIC42LjYgMS4xIDEuMiAxLjEiIGZpbGw9IiNmZmJkMDMiLz48cGF0aCBkPSJtMTkuOCAzNy41YzAtLjYtLjUtMS4yLTEuMS0xLjJoLTMuOWMtLjYgMC0xLjEuNi0xLjEgMS4ycy41IDEuMiAxLjEgMS4yaDMuOWMuNiAwIDEuMS0uNiAxLjEtMS4yIiBmaWxsPSIjZmZiZDAzIi8+PC9nPjxnPjxwYXRoIGQ9Im0zNy41IDM2LjVjLjEgMCAuMiAwIC4zIDAgLjYtMS41IDEuNi0yLjggMi43LTMuOC0xLjctMi45LTQuOS00LjgtOC41LTQuOC01LjUgMC05LjkgNC40LTkuOSA5LjkgMCAzLjggMi4xIDcuMSA1LjMgOC43LjYtMS42IDEuOC0yLjkgMy41LTMuNCAwLTMuNiAzLTYuNiA2LjYtNi42IiBmaWxsPSIjZmZiZDAzIi8+PHBhdGggZD0ibTQ0LjMgNDcuM2MuNSAwIDEuMS4xIDEuNi4yIDEuNi0xLjcgMy44LTIuNyA2LjItMi43IDMuMiAwIDYuMSAxLjcgNy41IDQuNSAwIDAgMCAwIC4xIDAgMS41IDAgMi44LjUgMy45IDEuMyAxLjctMS40IDIuOC0zLjQgMi44LTUuOCAwLTQuMS0zLjMtNy40LTcuNC03LjQtLjkgMC0xLjguMi0yLjYuNS0xLjItMy42LTQuNS02LjItOC41LTYuMi00LjIgMC03LjcgMi45LTguNyA2LjgtLjUtLjEtMS0uMi0xLjUtLjItMi43IDAtNSAyLjItNSA1IDAgLjUuMS45LjIgMS40LS4xIDAtLjEgMC0uMiAwLTIuMSAwLTMuOCAxLjctMy44IDMuOCAwIDIuMSAxLjcgMy44IDMuOCAzLjguMiAwIDIgMCA0LjUgMCAxLjEtMyAzLjktNSA3LjEtNSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Im01OS42IDUxYy0uNCAwLS44IDAtMS4xLjEtLjktMi43LTMuNC00LjctNi40LTQuNy0yLjMgMC00LjQgMS4yLTUuNiAzLS43LS4zLTEuNC0uNC0yLjItLjQtMy4zIDAtNiAyLjctNiA2IDAgMy4zIDIuNyA2IDYgNiAwIDAgMTMuNiAwIDE1LjMgMCAyLjcgMCA1LTIuMiA1LTVzLTIuMi01LTUtNSIgZmlsbD0iI2ZmZiIvPjwvZz48L2c+PC9nPjwvc3ZnPgo=';\n","/* eslint-disable no-extra-parens */\nimport Image from 'next/image';\nimport { useState } from 'react';\nimport styled from 'styled-components';\nimport { DEFAULT_ICON_CODE } from '../../../../lib/services/forecastDataService/weatherForecastDataService/constants';\nimport { base64BlurImageDataURL } from './constants';\n\ntype WeatherForecastIconProps = {\n iconSrc: string;\n iconImageAlt: string;\n height?: number;\n width?: number;\n sizes?: string;\n priority?: boolean;\n};\n\nexport const WeatherForecastIcon = ({\n iconSrc,\n iconImageAlt,\n height = 40,\n width = 40,\n sizes = '300px',\n priority = true\n}: WeatherForecastIconProps) => {\n const [imgSrc, setImgSrc] = useState(iconSrc);\n const [hasAttemptedFallback, setHasAttemptedFallback] = useState(false);\n\n const handleImageError = () => {\n if (hasAttemptedFallback || !iconSrc) {\n return;\n }\n\n const fallbackIconUrl = new URL(iconSrc);\n\n fallbackIconUrl.searchParams.set('iconCode', `${DEFAULT_ICON_CODE}`);\n\n setImgSrc(fallbackIconUrl?.toString() ?? '');\n // Let's prevent infinite loop if image keeps failing to load including the fallback.\n setHasAttemptedFallback(true);\n };\n return (\n \n \n \n );\n};\n\ntype ImageContainerProps = {\n imageContainerWidth: number;\n imageContainerHeight: number;\n};\n\nconst ImageContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: ${({ imageContainerWidth }) => (imageContainerWidth ? `${imageContainerWidth}px` : '40px')};\n height: ${({ imageContainerHeight }) => (imageContainerHeight ? `${imageContainerHeight}px` : '40px')};\n overflow: hidden;\n border-radius: 50%;\n`;\n","/* eslint-disable operator-linebreak */\nimport styled from 'styled-components';\n\nexport const SummaryContainer = styled.summary`\n display: -webkit-box;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n margin: 0;\n width: 100%;\n gap: 1rem;\n\n &::-webkit-details-marker {\n display: none;\n }\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n gap: 0.5rem;\n }\n`;\n\ntype CaretContainerProps = {\n rotationDeg: number;\n};\nexport const CaretContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 25px;\n transition: all 0.25s ease-out;\n transform: ${({ rotationDeg }) => Number.isInteger(rotationDeg) && `rotate(${rotationDeg}deg)`};\n`;\n","/* eslint-disable operator-linebreak */\nimport styled from 'styled-components';\nimport { parseAndFormatISO8601DateStr } from '../../../../../../components/utilities/dateTimeUtils';\nimport { DEFAULT_FORECAST_VALUE } from '../../../../../lib/utils/constants';\nimport { hourlyHeaderDateFormat } from '../../../../../lib/utils/forecastUtils';\n\ntype DateDisplayProps = {\n forecastDateLocalStr: string;\n};\n\nexport const DateDisplay = ({ forecastDateLocalStr }: DateDisplayProps) => {\n const dateDisplay = DEFAULT_FORECAST_VALUE;\n\n if (!forecastDateLocalStr) {\n return {dateDisplay};\n }\n const formatedDateDisplay = parseAndFormatISO8601DateStr(forecastDateLocalStr, hourlyHeaderDateFormat, true);\n\n return (\n \n {formatedDateDisplay}\n \n );\n};\n\nconst DateDetails = styled.h2`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.25rem;\n margin: 0;\n width: 100%;\n`;\n\nconst TimePart = styled.time`\n display: flex;\n align-items: center;\n`;\n","import styled from 'styled-components';\nimport { isValidNumber } from '../../../../../../lib/utils/guardUtils/guardUtils';\nimport { generateLowHighDisplay } from '../../../../../lib/utils/forecastUtils';\n\ntype HighLowDisplayProps = {\n hourTemperature?: number;\n};\n\nexport const HourTemperatureDisplay = ({ hourTemperature }: HighLowDisplayProps) => {\n const tempDisplayText = generateLowHighDisplay(hourTemperature);\n const temperatureAria = isValidNumber(hourTemperature) ? `Temperature ${hourTemperature} degrees` : '';\n return (\n \n {tempDisplayText}\n {isValidNumber(hourTemperature) && °}\n \n );\n};\n\nconst Container = styled.span`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n width: 100%;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1.25rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1.5rem;\n`;\n\nconst TempDisplay = styled.span`\n display: flex;\n font-weight: 600;\n`;\n\nconst DegreeSymbol = styled.sup`\n display: flex;\n`;\n","/* eslint-disable no-extra-parens */\n/* eslint-disable prettier/prettier */\nimport styled from 'styled-components';\nimport { ArrowIcon } from '../../../../../../components/elements/icons/arrow/arrowIcon';\nimport { ArrowDirections } from '../../../../../../components/elements/icons/iconConstants';\nimport { WeatherForecastIcon } from '../../../../../../components/elements/icons/weatherForecastIcon/weatherForecastIcon';\nimport { DEFAULT_FORECAST_VALUE } from '../../../../../lib/utils/constants';\nimport { CaretContainer, SummaryContainer } from '../commonStyles';\nimport { DateDisplay } from './dateDisplay';\nimport { HourTemperatureDisplay } from './temperatureDisplay';\n\ntype HourlyDisclosureSummaryProps = {\n isOpen: boolean;\n iconURL: string;\n hourForecastDetailDescription: string;\n precipProbabability?: number;\n hourlyTemperature?: number;\n forecastDateLocalStr: string;\n};\n\nexport const HourlyDisclosureSummaryDetails = ({\n isOpen,\n iconURL,\n hourForecastDetailDescription,\n precipProbabability,\n hourlyTemperature,\n forecastDateLocalStr\n}: HourlyDisclosureSummaryProps) => {\n const caretIconTitle = isOpen ? 'Arrow up' : 'Arrow down';\n const caretIconRotation = isOpen ? ArrowDirections.Up : ArrowDirections.Down;\n const precipDisplay = Number.isFinite(precipProbabability)\n ? `Precip ${precipProbabability}%`\n : DEFAULT_FORECAST_VALUE;\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n {hourForecastDetailDescription}\n \n \n {precipDisplay}\n \n \n \n \n \n \n \n \n \n );\n};\n\nconst HourlyListItemSummaryContainer = styled(SummaryContainer)`\n height: 4.063rem;\n ${({ theme }) => theme.mediaQueries.mobile} {\n height: 4.938rem;\n }\n`;\n\nconst CollapsedSummaryContentWrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n height: 100%;\n width: 100%;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n gap: 0.7rem;\n }\n`;\n\nconst Container = styled.div`\n display: grid;\n grid-template-columns: 1fr 30px;\n grid-template-rows: 1fr;\n padding: 0 16px 0 16px;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n width: 100%;\n height: 100%;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n padding: 0 12px 0 12px;\n gap: 0.7rem;\n }\n`;\n\nconst ForecastSummaryDetails = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 7px;\n align-items: flex-start;\n width: calc(100% - 49px);\n`;\n\nconst SummaryDetailsTopInfo = styled.div`\n display: grid;\n grid-template-columns: 2fr 1fr;\n grid-template-rows: 1.5rem;\n align-items: center;\n width: 100%;\n`;\n\nconst SummaryDetailsBottomInfoContainer = styled.div`\n display: grid;\n grid-template-columns: 2fr 1fr;\n grid-template-rows: 1rem;\n width: 100%;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.875rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1rem;\n`;\n\nconst ForecastDetailDescriptionItem = styled.span`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n width: 100%;\n height: 100%;\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n`;\n\nconst HourForecastPrecipDescription = styled.span`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n width: 100%;\n height: 100%;\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n`;\n","/* eslint-disable indent */\n/* eslint-disable operator-linebreak */\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { HourlyDisclosureSummaryDetails } from './summary/hourly/hourlyDisclosureSummaryDetails';\n\ntype HourlyForecastDisclosureListItemProps = {\n children: React.ReactNode;\n iconURL: string;\n hourForecastDetailDescription: string;\n precipProbabability?: number;\n temperature?: number;\n forecastDateLocalStr: string;\n expandFirstCard: boolean;\n};\n\nexport const HourlyForecastDisclosureListItem = ({\n children,\n iconURL,\n hourForecastDetailDescription,\n precipProbabability,\n temperature,\n forecastDateLocalStr,\n expandFirstCard\n}: HourlyForecastDisclosureListItemProps) => {\n const detailsRef = useRef(null);\n const [isOpen, setIsOpen] = useState(expandFirstCard ?? false);\n\n const handleToggle = () => {\n if (detailsRef.current) {\n setIsOpen(detailsRef.current?.open);\n }\n };\n\n useEffect(() => {\n if (detailsRef.current) {\n setIsOpen(detailsRef.current?.open);\n }\n }, []);\n\n return (\n \n \n {children}\n \n );\n};\n\nconst Container = styled.details`\n display: block;\n width: 100%;\n height: 4.063rem;\n border-radius: 4px;\n align-content: center;\n background: #fff;\n transition: height 0.3s ease-out, min-height 0.3s ease-out;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n justify-content: center;\n height: 4.938rem;\n }\n\n &[open] {\n justify-content: flex-start;\n min-height: 125px;\n height: auto;\n }\n`;\n\nconst ExpandedForecastContent = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n height: auto;\n background-color: ${({ theme }) => theme.colors.greyTertiary};\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.813rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1rem;\n`;\n","/* eslint-disable no-extra-parens */\nimport { Fragment } from 'react';\nimport styled from 'styled-components';\nimport { DisplayAdWidgetWrapper } from '../../../../../components/modules/ads/displayAds/widget/displayAdWidgetWrapper';\nimport { type SolarV2CompactType } from '../../../../../lib/services/forecastDataService/almanacDataService/types';\nimport { DEFAULT_ICON_CODE } from '../../../../../lib/services/forecastDataService/weatherForecastDataService/constants';\nimport type { HourlyForecastPeriodV3 } from '../../../../../lib/services/forecastDataService/weatherForecastDataService/types';\nimport {\n HOURLY_FORECAST_PAGE_LIST_ITEMS_AD_CONFIGS_300_250_1_LIST,\n HOURLY_FORECAST_PAGE_LIST_ITEMS_AD_CONFIGS_300_250_2_LIST\n} from '../../../../lib/adComponents/bannerAdConfigs';\nimport { generateIconURLFromTemplate, shouldShowSunriseOrSunset } from '../../../../lib/utils/forecastUtils';\nimport { SunriseSunsetHourlyListItem } from '../../almanacHourlyListItem/sunriseSunsetHourlyListItem';\nimport { HourlyDisclosureDetails } from '../../forecastDisclosureListItem/details/hourly/hourlyForecastDetailItem';\nimport { HourlyForecastDisclosureListItem } from '../../forecastDisclosureListItem/hourlyForecastDisclosureListItem';\n\ntype HourlyForecastListProps = {\n hourlyWeatherForecastAPIData: Array;\n forecastIconUrlTemplate: string;\n solar?: SolarV2CompactType;\n};\n\nexport const HourlyForecastList = ({\n hourlyWeatherForecastAPIData,\n forecastIconUrlTemplate,\n solar\n}: HourlyForecastListProps) => {\n let didShowSunrise = false;\n let didShowSunset = false;\n return (\n \n {hourlyWeatherForecastAPIData.map((forecast, index) => {\n if (forecast) {\n if (solar?.srds && !didShowSunrise) {\n // TODO: revisit and optimize solution\n const showSunrise = shouldShowSunriseOrSunset(forecast.fdtolcl, solar?.srdtolcl);\n if (showSunrise) {\n didShowSunrise = true;\n return (\n \n \n \n \n \n {index === 8 ? (\n \n \n \n ) : null}\n {index === 20 ? (\n \n \n \n ) : null}\n \n );\n }\n }\n\n if (solar?.ssds && !didShowSunset) {\n // TODO: revisit and optimize solution\n const showSunrise = shouldShowSunriseOrSunset(forecast.fdtolcl, solar?.ssdtolcl);\n if (showSunrise) {\n didShowSunset = true;\n return (\n \n \n \n \n \n {index === 8 ? (\n \n \n \n ) : null}\n {index === 20 ? (\n \n \n \n ) : null}\n \n );\n }\n }\n return (\n \n \n \n \n {index === 8 ? (\n \n \n \n ) : null}\n {index === 20 ? (\n \n \n \n ) : null}\n \n );\n }\n return null;\n })}\n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n padding-bottom: 16px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 0.35rem;\n`;\n\nconst MobileAdContainer = styled.div`\n display: none;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n display: flex;\n width: 100%;\n height: 250px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n`;\n","import styled from 'styled-components';\nimport { WeatherForecastIcon } from '../../../../../../components/elements/icons/weatherForecastIcon/weatherForecastIcon';\nimport { generateDayNightDisplayText } from '../../../../../lib/utils/forecastUtils';\nimport { type DayForecastItemType } from '../../../../_utils/types';\n\ntype TenDayForecastDetailItemProps = {\n forecast?: DayForecastItemType;\n};\n\nexport const TenDayForecastDetailItem = ({ forecast }: TenDayForecastDetailItemProps) => {\n if (!forecast) {\n return null;\n }\n\n const dayNightDisplayText = generateDayNightDisplayText(forecast?.intp, forecast.isToday);\n return (\n \n \n \n \n {dayNightDisplayText}\n \n \n {forecast.t}\n °\n \n \n {forecast.dd}\n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 0.5rem 0;\n`;\n\nconst DetailDescription = styled.p`\n display: flex;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1.313rem;\n`;\n\nconst DetailHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst IconDayInfo = styled.div`\n display: flex;\n width: auto;\n align-items: center;\n gap: 1rem;\n`;\n\nconst DayNightInfo = styled.h2`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.25rem;\n margin: 0;\n`;\n\nconst TemperatureReading = styled.span`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: flex-start;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1.25rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.5rem;\n`;\n\nconst DegreeSymbol = styled.sup`\n display: flex;\n`;\n","import Link from 'next/link';\nimport styled, { useTheme } from 'styled-components';\nimport { ArrowIcon } from '../../../../../../components/elements/icons/arrow/arrowIcon';\nimport { ArrowDirections } from '../../../../../../components/elements/icons/iconConstants';\nimport { HOURLY_DETAILS_TEXT } from '../../../../../lib/utils/constants';\nimport { CaretContainer } from '../../summary/commonStyles';\n\ntype TenDayForecastDetailItemLinkProps = {\n linkURL: string;\n};\n\nexport const TenDayForecastDetailItemLink = ({ linkURL }: TenDayForecastDetailItemLinkProps) => {\n const { colors } = useTheme();\n return (\n // Only enable prefetch if page has been fully moved to web 2 - but watch out for cookies being set in prefetch response headers.\n \n {HOURLY_DETAILS_TEXT}\n \n \n \n \n );\n};\n\nconst Container = styled(Link)`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n align-items: center;\n padding: 1rem 0 0.5rem 0;\n text-decoration: none;\n`;\n\nconst LinkText = styled.span`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: flex-start;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.9375rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.25rem;\n`;\n","import styled from 'styled-components';\nimport { type DayForecastItemType } from '../../../../_utils/types';\nimport { TenDayForecastDetailItem } from './tenDayForecastDetailItem';\nimport { TenDayForecastDetailItemLink } from './tenDayForecastDetailItemLink';\n\ntype TenDayForecastDisclosureDayNightDetailsProps = {\n day?: DayForecastItemType;\n night: DayForecastItemType;\n hourlyForecastPageLink: string;\n showHourlyForecastPageLink: boolean;\n};\n\nexport const TenDayForecastDisclosureDayNightDetails = ({\n day,\n night,\n hourlyForecastPageLink,\n showHourlyForecastPageLink\n}: TenDayForecastDisclosureDayNightDetailsProps) => {\n return (\n \n \n \n \n \n {showHourlyForecastPageLink ? : null}\n \n );\n};\n\nconst ForecastDetailsWithLinkSection = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n`;\n\nconst DayNightDetails = styled.div`\n display: flex;\n flex-direction: column;\n border-top: 1px solid rgba(0, 17, 102, 0.1);\n border-bottom: 1px solid rgba(0, 17, 102, 0.1);\n background: ${({ theme }) => theme.colors.base};\n`;\n","/* eslint-disable operator-linebreak */\nimport styled from 'styled-components';\nimport { parseAndFormatISO8601DateStr } from '../../../../../../components/utilities/dateTimeUtils';\nimport { DEFAULT_FORECAST_VALUE } from '../../../../../lib/utils/constants';\nimport { dailyHeaderDateFormat, generateDayNightDisplayText } from '../../../../../lib/utils/forecastUtils';\n\ntype DateDisplayProps = {\n isNightTimePeriod: boolean;\n forecastDateLocalStr: string;\n isToday: boolean;\n isSummaryDisplayOpen: boolean;\n};\n\nexport const DateDisplay = ({\n isNightTimePeriod,\n forecastDateLocalStr,\n isToday,\n isSummaryDisplayOpen\n}: DateDisplayProps) => {\n const dateDisplay = DEFAULT_FORECAST_VALUE;\n\n if (!forecastDateLocalStr) {\n return {dateDisplay};\n }\n const formatedDateDisplay = parseAndFormatISO8601DateStr(forecastDateLocalStr, dailyHeaderDateFormat, false);\n const dayNightInfo = generateDayNightDisplayText(isNightTimePeriod, isToday);\n\n return (\n \n {formatedDateDisplay}\n {!isSummaryDisplayOpen ? `, ${dayNightInfo}` : ''}\n \n );\n};\n\nconst DateDetails = styled.h2`\n display: flex;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1.25rem;\n margin: 0;\n`;\n\nconst TimePart = styled.time`\n display: flex;\n align-items: center;\n`;\n","import styled from 'styled-components';\nimport { isValidNumber } from '../../../../../../lib/utils/guardUtils/guardUtils';\nimport { generateLowHighDisplay } from '../../../../../lib/utils/forecastUtils';\n\ntype HighLowDisplayProps = {\n tempHigh?: number;\n tempLow?: number;\n};\n\nexport const HighLowDisplay = ({ tempHigh, tempLow }: HighLowDisplayProps) => {\n const highDisplayText = generateLowHighDisplay(tempHigh);\n const lowDisplayText = generateLowHighDisplay(tempLow);\n\n const highTempAria = isValidNumber(tempHigh) ? `High temperature ${tempHigh} degrees,` : '';\n const lowTempAria = isValidNumber(tempLow) ? `low temperature ${tempLow} degrees` : '';\n return (\n \n \n {highDisplayText}\n {isValidNumber(tempHigh) && °}|{lowDisplayText}\n {isValidNumber(tempLow) && °}\n \n \n );\n};\n\nconst Container = styled.span`\n display: flex;\n flex-direction: row;\n width: auto;\n max-width: 35%;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1.25rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1.5rem;\n`;\n\nconst AccessibilityContainer = styled.div`\n display: flex;\n flex-direction: row;\n width: auto;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1.25rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1.5rem;\n`;\n\nconst TempHigh = styled.span`\n justify-items: flex-end;\n font-weight: 600;\n`;\n\nconst TempLow = styled.span`\n justify-items: flex-start;\n`;\n\nconst DegreeSymbol = styled.sup`\n display: flex;\n`;\n","/* eslint-disable no-extra-parens */\n/* eslint-disable prettier/prettier */\nimport styled from 'styled-components';\nimport { ArrowIcon } from '../../../../../../components/elements/icons/arrow/arrowIcon';\nimport { ArrowDirections } from '../../../../../../components/elements/icons/iconConstants';\nimport { WeatherForecastIcon } from '../../../../../../components/elements/icons/weatherForecastIcon/weatherForecastIcon';\nimport { CaretContainer, SummaryContainer } from '../commonStyles';\nimport { DateDisplay } from './dateDisplay';\nimport { HighLowDisplay } from './highLowDisplay';\n\ntype TenDayDisclosureSummaryProps = {\n isOpen: boolean;\n iconURL: string;\n forecastSummaryDetails: string;\n isNightTimePeriod: boolean;\n dayTempHigh?: number;\n nightTempLow?: number;\n forecastDateLocalStr: string;\n isToday: boolean;\n};\n\nexport const TenDayDisclosureSummaryDetails = ({\n isOpen,\n iconURL,\n forecastSummaryDetails,\n dayTempHigh,\n nightTempLow,\n forecastDateLocalStr,\n isNightTimePeriod,\n isToday\n}: TenDayDisclosureSummaryProps) => {\n const caretIconTitle = isOpen ? 'Arrow up' : 'Arrow down';\n const caretIconRotation = isOpen ? ArrowDirections.Up : ArrowDirections.Down;\n return (\n \n \n \n \n \n \n \n \n \n \n \n {forecastSummaryDetails}\n \n \n\n \n \n \n \n );\n};\n\nconst CollapsedSummaryContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n gap: 1rem;\n height: 100%;\n width: 100%;\n`;\nconst ExpandedSummaryContainer = styled.div`\n display: flex;\n width: calc(100% - 25px);\n`;\n\nconst ForecastSummaryDetails = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n align-items: flex-start;\n width: calc(100% - 49px);\n`;\n\nconst SummaryDetailsTopInfo = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n`;\n\nconst SummaryDetailsBottomInfo = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.875rem;\n font-style: normal;\n font-weight: 600;\n line-height: 1rem;\n`;\n","/* eslint-disable operator-linebreak */\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { TenDayDisclosureSummaryDetails } from './summary/tenDay/tenDayDisclosureSummaryDetails';\n\ntype ForecastDisclosureListItemProps = {\n children: React.ReactNode;\n iconURL: string;\n forecastSummaryDetails: string;\n isNightTimePeriod: boolean;\n dayTempHigh?: number;\n nightTempLow?: number;\n forecastDateLocalStr: string;\n isToday: boolean;\n};\n\nexport const ForecastDisclosureListItem = ({\n children,\n iconURL,\n forecastSummaryDetails,\n dayTempHigh,\n nightTempLow,\n forecastDateLocalStr,\n isNightTimePeriod,\n isToday\n}: ForecastDisclosureListItemProps) => {\n const detailsRef = useRef(null);\n const [isOpen, setIsOpen] = useState(isToday ?? false);\n\n const handleToggle = () => {\n if (detailsRef.current) {\n setIsOpen(detailsRef.current?.open);\n }\n };\n\n useEffect(() => {\n if (detailsRef.current) {\n setIsOpen(detailsRef.current?.open);\n }\n }, []);\n\n return (\n \n \n {children}\n \n );\n};\n\nconst Container = styled.details`\n display: block;\n width: 100%;\n height: 69px;\n border-radius: 4px;\n padding: 0.5rem 1rem;\n background: #fff;\n transition: height 0.3s ease-out, min-height 0.3s ease-out;\n\n #expandSummary {\n display: none;\n }\n\n #collapseSummary {\n display: flex;\n }\n\n &[open] {\n justify-content: flex-start;\n min-height: 153px;\n height: auto;\n\n > summary {\n padding: 8px 0 16px 0;\n\n #expandSummary {\n display: flex;\n }\n\n #collapseSummary {\n display: none;\n }\n }\n }\n`;\n\nconst ExpandedForecastContent = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n height: auto;\n\n color: ${({ theme }) => theme.colors.strongText};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 0.813rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1rem;\n`;\n","import styled from 'styled-components';\nimport { WEEKEND_BOUNDARY } from '../../../lib/utils/constants';\n\nexport const WeekendBoundary = () => {\n return (\n \n {WEEKEND_BOUNDARY}\n \n \n );\n};\n\nconst Container = styled.div.attrs({ role: 'separator' })`\n display: flex;\n height: 1.5rem;\n padding: 0.5rem 1rem;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n width: 100%;\n`;\n\nconst SeparatorDot = styled.span.attrs({ 'aria-hidden': true })`\n display: inline-block;\n content: '';\n width: 9px;\n height: 9px;\n border-radius: 100%;\n background-color: rgba(255, 255, 255, 0.3);\n`;\n\nconst VisuallyHidden = styled.span`\n display: inline-block;\n position: absolute;\n width: 1px;\n height: 1px;\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n`;\n","/* eslint-disable operator-linebreak */\nimport styled from 'styled-components';\nimport { DisplayAdWidgetWrapper } from '../../../../../components/modules/ads/displayAds/widget/displayAdWidgetWrapper';\nimport type { DailyForecastPeriodLegacyCompactType } from '../../../../../lib/services/forecastDataService/weatherForecastDataService/types';\nimport { DAILY_FORECAST_PAGE_LIST_ITEMS_AD_CONFIGS } from '../../../../lib/adComponents/bannerAdConfigs';\nimport { FORECAST_PATHNAMES } from '../../../../lib/utils/constants';\nimport {\n createDailyForecastListItemGroupsFromAPIData,\n generateRenderableDailyForecastListUIData,\n getDayForecastItemHourCardSlug,\n shouldShowHourlyDetailsLinkOnDailyItem\n} from '../../../../lib/utils/forecastUtils';\nimport { TenDayForecastDisclosureDayNightDetails } from '../../forecastDisclosureListItem/details/tenDay/tenDayForecastDisclosureDayNightDetails';\nimport { ForecastDisclosureListItem } from '../../forecastDisclosureListItem/forecastDisclosureListItem';\nimport { WeekendBoundary } from '../../weekendBoundary/weekendBoundary';\n\ntype TenDayForecastListProps = {\n rawDailyWeatherForecastAPIData: Array;\n forecastIconUrlTemplate: string;\n currentLocationSlugName: string;\n enableNewHourlyForecastLinksOn10DayPage?: boolean;\n};\n\nexport const TenDayForecastList = ({\n rawDailyWeatherForecastAPIData,\n forecastIconUrlTemplate,\n currentLocationSlugName,\n enableNewHourlyForecastLinksOn10DayPage\n}: TenDayForecastListProps) => {\n const data = createDailyForecastListItemGroupsFromAPIData(rawDailyWeatherForecastAPIData, forecastIconUrlTemplate);\n const renderableDailyForecastData = generateRenderableDailyForecastListUIData(data);\n const firstForecastItemIsNightTime = rawDailyWeatherForecastAPIData?.[0]?.intp;\n\n return (\n \n {renderableDailyForecastData.map((dailyForecastUIItemData, index) => {\n if (dailyForecastUIItemData.type === 'weekendSeparator') {\n return ;\n }\n\n if (dailyForecastUIItemData.type === 'ad') {\n return (\n \n \n \n );\n }\n\n if (dailyForecastUIItemData.type === 'forecast') {\n const firstItemInEachForecastGroup = dailyForecastUIItemData.item?.[0];\n const secondItemInEachForecastGroup = dailyForecastUIItemData.item?.[1];\n\n const forecastDateLocalStr =\n firstItemInEachForecastGroup?.fdls ?? secondItemInEachForecastGroup?.fdls;\n const hourCardSlug = getDayForecastItemHourCardSlug(\n forecastDateLocalStr,\n enableNewHourlyForecastLinksOn10DayPage\n );\n\n const hourlyForecastPageLink =\n currentLocationSlugName && hourCardSlug\n ? `${FORECAST_PATHNAMES.hourly}/${currentLocationSlugName}/?hour=${hourCardSlug}`\n : `${FORECAST_PATHNAMES.hourly}`;\n\n return (\n \n \n \n );\n }\n return null;\n })}\n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n padding-bottom: 2rem;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 0.5rem;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n gap: 0.33rem;\n }\n`;\n\nconst MobileAdContainer = styled.div`\n display: none;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n display: flex;\n width: 100%;\n height: 250px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n`;\n","import styled from 'styled-components';\nimport { parseAndFormatISO8601DateStr } from '../../../../../components/utilities/dateTimeUtils';\nimport { DEFAULT_FORECAST_VALUE } from '../../../../lib/utils/constants';\n\ntype TenDayForecastPageDateHeaderProps = {\n forecastPeriodStart: string;\n forecastPeriodEnd: string;\n};\n\nconst forecastStartDateFormat = 'LLL d';\nconst forecastEndDateFormat = `${forecastStartDateFormat}, y`;\n\nexport const TenDayForecastPageDateHeader = ({\n forecastPeriodStart,\n forecastPeriodEnd\n}: TenDayForecastPageDateHeaderProps) => {\n const startDate = forecastPeriodStart\n ? parseAndFormatISO8601DateStr(forecastPeriodStart, forecastStartDateFormat, false)\n : DEFAULT_FORECAST_VALUE;\n const endDate = forecastPeriodEnd\n ? parseAndFormatISO8601DateStr(forecastPeriodEnd, forecastEndDateFormat, false)\n : DEFAULT_FORECAST_VALUE;\n return (\n \n {/* Note: ScreenReaderOnly is visually hidden but accessible to screen readers. */}\n Forecast for dates \n {startDate}\n \n through\n {endDate}\n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.base};\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-style: normal;\n font-weight: 400;\n line-height: 1.25rem;\n margin: 0;\n`;\n\nconst TimeDisplay = styled.time`\n font: inherit;\n`;\n\nconst Separator = styled.span`\n display: flex;\n font: inherit;\n padding: 0 3px;\n`;\n\nconst ScreenReaderOnly = styled.span`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n`;\n","import styled from 'styled-components';\n\ntype ForecastPageHeaderProps = {\n pageHeader: string;\n};\n\nexport const ForecastPageHeader = ({ pageHeader }: ForecastPageHeaderProps) => {\n return (\n \n {pageHeader}\n \n );\n};\n\nconst HeaderWrapper = styled.div`\n display: flex;\n justify-content: flex-start;\n flex-direction: row;\n align-items: center;\n height: auto;\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n flex-wrap: wrap;\n`;\n\nconst HeaderText = styled.h1`\n font-family: ${({ theme }) => theme.fonts.sourceSans3FontFamily};\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25rem;\n color: ${({ theme }) => theme.colors.base};\n display: flex;\n margin: 0;\n width: 100%;\n max-width: calc(100% - 1px);\n white-space: pre-line;\n word-wrap: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n flex-basis: 100%;\n flex-shrink: 1;\n min-width: 0;\n`;\n","import styled from 'styled-components';\n\ntype HourlyForecastSectionContentProps = {\n forecastSubNavigationMenuUI: React.ReactNode;\n forecastPageHeaderComponentUI: React.ReactNode;\n dynamicHourlyForecastListComponentUI: React.ReactNode;\n};\n\nexport const HourlyForecastSectionContentV2 = ({\n forecastSubNavigationMenuUI,\n forecastPageHeaderComponentUI,\n dynamicHourlyForecastListComponentUI\n}: HourlyForecastSectionContentProps) => {\n return (\n \n {forecastPageHeaderComponentUI}\n {forecastSubNavigationMenuUI}\n {dynamicHourlyForecastListComponentUI}\n {forecastSubNavigationMenuUI}\n \n );\n};\n\nconst SectionLayoutContainer = styled.section`\n display: grid;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n\n grid-template-areas:\n 'contentHeader'\n 'subMenu1'\n 'forecastInfo'\n 'subMenu2';\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto 49px 1fr 49px;\n gap: 1rem;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n grid-template-areas:\n 'contentHeader'\n 'subMenu1'\n 'forecastInfo'\n 'subMenu2';\n grid-template-columns: 1fr;\n grid-template-rows: auto 49px 1fr 49px;\n\n padding: 3px;\n gap: 0.75rem;\n }\n`;\n\nconst ContentHeader = styled.div`\n grid-area: contentHeader;\n min-height: 21px;\n`;\n\nconst SubMenu1 = styled.div`\n grid-area: subMenu1;\n width: 100%;\n overflow: hidden;\n`;\n\nconst ForecastInfo = styled.div`\n grid-area: forecastInfo;\n`;\n\nconst SubMenu2 = styled.div`\n grid-area: subMenu2;\n width: 100%;\n overflow: hidden;\n`;\n","import styled from 'styled-components';\n\ntype TenDayForecastSectionContentProps = {\n tenForecastListComponentUI: React.ReactNode;\n forecastPageHeaderComponentUI: React.ReactNode;\n tenDayForecastPageDateHeaderComponentUI: React.ReactNode;\n};\n\nexport const TenDayForecastSectionContentV2 = ({\n tenForecastListComponentUI,\n forecastPageHeaderComponentUI,\n tenDayForecastPageDateHeaderComponentUI\n}: TenDayForecastSectionContentProps) => {\n return (\n \n {forecastPageHeaderComponentUI}\n {tenDayForecastPageDateHeaderComponentUI}\n {tenForecastListComponentUI}\n \n );\n};\n\nconst SectionLayoutContainer = styled.section`\n display: grid;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n\n grid-template-areas:\n 'contentHeader'\n 'tenDayForecastDateHeader'\n 'forecastInfo';\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto 23px 1fr;\n gap: 1rem;\n\n ${({ theme }) => theme.mediaQueries.mobile} {\n grid-template-areas:\n 'contentHeader'\n 'tenDayForecastDateHeader'\n 'forecastInfo';\n grid-template-columns: 1fr;\n grid-template-rows: auto 23px 1fr;\n\n padding: 3px;\n gap: 0.75rem;\n }\n`;\n\nconst ContentHeader = styled.div`\n grid-area: contentHeader;\n min-height: 19px;\n`;\n\nconst TenDayForecastDateHeaderWrapper = styled.div`\n grid-area: tenDayForecastDateHeader;\n height: 23px;\n`;\n\nconst ForecastInfo = styled.div`\n grid-area: forecastInfo;\n`;\n","/* eslint-disable no-extra-parens */\n/* eslint-disable operator-linebreak */\nimport Link, { type LinkProps } from 'next/link';\nimport { usePathname } from 'next/navigation';\nimport { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport { FORECAST_PATHNAMES } from '../../../lib/utils/constants';\nimport { type HourlyForecastNavigationDayItem } from '../../_utils/types';\n\ntype HourlyForecastDayNavigationProps = {\n days: HourlyForecastNavigationDayItem[];\n activeLocationSlugName: string;\n activeTabIndex: number;\n};\n\nexport const HourlyForecastDayNavigation = ({\n days,\n activeLocationSlugName,\n activeTabIndex\n}: HourlyForecastDayNavigationProps) => {\n const pathname = usePathname();\n const activeNavItemRef = useRef(null);\n const scrollableNavContainer = useRef(null);\n\n useEffect(() => {\n if (!activeNavItemRef.current || !scrollableNavContainer.current) {\n return;\n }\n\n const reqAnimationId = requestAnimationFrame(() => {\n const scrollContainer = scrollableNavContainer.current;\n const activeItem = activeNavItemRef.current;\n\n if (!scrollContainer || !activeItem) {\n return;\n }\n const navContainerWidth = scrollContainer.offsetWidth;\n const itemLeft = activeItem.offsetLeft;\n const itemWidth = activeItem.offsetWidth;\n\n const scrollPosition = itemLeft - (navContainerWidth / 2 + itemWidth / 2);\n\n scrollContainer.scrollTo({\n left: Math.max(0, scrollPosition),\n behavior: 'smooth'\n });\n });\n\n return () => {\n if (Number.isFinite(reqAnimationId)) {\n cancelAnimationFrame(reqAnimationId);\n }\n };\n }, [pathname, activeTabIndex]);\n\n return (\n \n {days?.map((day, index) => {\n const isActiveTab = index === activeTabIndex;\n const hourlyForecastPageLink =\n day.dateQueryParam && activeLocationSlugName\n ? `${FORECAST_PATHNAMES.hourly}/${activeLocationSlugName}/?hour=${day.dateQueryParam}`\n : `${FORECAST_PATHNAMES.hourly}`;\n\n return (\n \n {isActiveTab ? day.formattedSelectedNavDateDisplay : day.formattedUnSelectedNavDateDisplay}\n \n );\n })}\n \n );\n};\n\nconst NavContainer = styled.nav`\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: max-content;\n overflow-x: auto;\n overflow-y: hidden;\n width: 100%;\n\n scrollbar-width: thin;\n -ms-overflow-style: none;\n &::-webkit-scrollbar {\n height: 3px;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.3);\n border-radius: 4px;\n }\n padding: 8px 0;\n gap: 0.5rem;\n`;\n\ninterface DayLinkProps extends LinkProps {\n $isActiveHourlyLink?: boolean;\n}\n\nconst DayLink = styled(Link)`\n display: flex;\n padding: 8px 16px;\n border: 1px solid ${({ theme }) => theme.colors.base};\n font-family: ${({ theme }) => theme.fonts.robotoFontFamily};\n font-size: 1rem;\n min-width: 65px;\n justify-content: center;\n width: auto;\n font-style: normal;\n font-weight: 400;\n line-height: 1.25rem;\n text-decoration: none;\n border-radius: 9px;\n background-color: ${({ $isActiveHourlyLink, theme }) =>\n $isActiveHourlyLink ? theme.colors.base : theme.colors.brandBg};\n color: ${({ $isActiveHourlyLink, theme }) => ($isActiveHourlyLink ? theme.colors.nightShade : theme.colors.base)};\n white-space: nowrap;\n\n box-shadow: 0 0 1px 0px white inset, 0 0 1px 0px white;\n`;\n","/* eslint-disable */\n// prettier-ignore-file\n'use client';\n\nimport { getCookie } from 'cookies-next';\nimport { DateTime } from 'luxon';\nimport { useEffect, useLayoutEffect, useRef } from 'react';\nimport { type PageRouteInfo } from '../../../../components/types';\nimport type { SolarV2CompactType } from '../../../../lib/services/forecastDataService/almanacDataService/types';\nimport { type DailyForecastPeriodLegacyCompactType } from '../../../../lib/services/forecastDataService/weatherForecastDataService/types';\nimport { isValidArray } from '../../../../lib/utils/guardUtils/guardUtils';\nimport { setPageRouteInfo } from '../../../../store/redux/common/dataLayer/appConfig/slices/appConfigSlice';\nimport { setInitialUserProfile } from '../../../../store/redux/common/dataLayer/user/slices/userSlice';\nimport { useAppDispatch } from '../../../../store/redux/storeHooks/hooks';\nimport type { UserType } from '../../../../store/userStore/types';\nimport { setCookieOnClient } from '../../../lib/utils/clientComponentCookieHelper';\nimport {\n EM_LOGGED_IN_USER_PROFILE_COOKIE_NAME,\n FORECAST_PAGES_BASE_PATH,\n FORECAST_PATHNAMES\n} from '../../../lib/utils/constants';\nimport { HourlyForecastActiveDay, type HourlyForecastNavigationDayItem } from '../../_utils/types';\nimport { Error } from '../forecastErrorUI/error';\nimport { HourlyForecastList } from '../forecastList/hourly/hourlyForecastList';\nimport { TenDayForecastList } from '../forecastList/tenDay/tenDayForecastList';\nimport { TenDayForecastPageDateHeader } from '../forecastPageDateHeader/tenDay/tenDayForecastPageDateHeader';\nimport { ForecastPageHeader } from '../forecastPageHeader/forecastPageHeader';\nimport { HourlyForecastSectionContentV2 } from '../forecastSectionContent/hourlyForecastSectionContent';\nimport { TenDayForecastSectionContentV2 } from '../forecastSectionContent/tenDayForecastSectionContent';\nimport { HourlyForecastDayNavigation } from '../forecastSubNavigation/hourlyForecastDayNavigation';\n\ntype ForecastDetailsWrapperProps = {\n user: UserType;\n currentRoutePathname: string;\n userStateCookieName: string;\n serializedUserForCookie: string;\n loggedInUserName?: string;\n weatherForecastIconTemplateUrl: string;\n forcastDaily?: Array;\n activeHourlyForecastTab?: HourlyForecastActiveDay;\n hourlyForecastSubNavDays?: HourlyForecastNavigationDayItem[];\n hourlySolar?: SolarV2CompactType;\n routeInfo: PageRouteInfo;\n pageHeaderDisplayText: string;\n enableNewHourlyForecastLinksOn10DayPage?: boolean;\n};\n\nexport const ForecastDetailsWrapper = ({\n user,\n currentRoutePathname,\n userStateCookieName,\n serializedUserForCookie,\n loggedInUserName,\n weatherForecastIconTemplateUrl,\n forcastDaily,\n activeHourlyForecastTab,\n hourlyForecastSubNavDays,\n hourlySolar,\n routeInfo,\n pageHeaderDisplayText,\n enableNewHourlyForecastLinksOn10DayPage\n}: ForecastDetailsWrapperProps) => {\n const dispatch = useAppDispatch();\n\n const initialServerDataSetToReduxState = useRef(false);\n const prevUserUnits = useRef<{\n Units: number | null;\n TempUnit: number | null;\n PressureUnit: number | null;\n WindUnit: number | null;\n }>({\n Units: null,\n TempUnit: null,\n PressureUnit: null,\n WindUnit: null\n });\n\n useLayoutEffect(() => {\n // set initial user data to global redux store - so the client doesn't have to perform another request.\n if (!initialServerDataSetToReduxState.current) {\n // set user to redux store\n if (user?.DeviceId && user?.ActiveLocation?.Id) {\n dispatch(setInitialUserProfile(user));\n prevUserUnits.current = {\n Units: user.Units,\n TempUnit: user.TempUnit,\n PressureUnit: user.PressureUnit,\n WindUnit: user.WindUnit\n };\n }\n\n if (routeInfo) {\n dispatch(setPageRouteInfo(routeInfo));\n }\n initialServerDataSetToReduxState.current = true;\n }\n }, []);\n\n useEffect(() => {\n if (\n user &&\n initialServerDataSetToReduxState.current &&\n ((prevUserUnits.current.WindUnit && user?.WindUnit !== prevUserUnits.current.WindUnit) ||\n (prevUserUnits.current.Units && user?.Units !== prevUserUnits.current.Units) ||\n (prevUserUnits.current.TempUnit && user?.TempUnit !== prevUserUnits.current.TempUnit) ||\n (prevUserUnits.current.PressureUnit && user?.PressureUnit !== prevUserUnits.current.PressureUnit))\n ) {\n dispatch(setInitialUserProfile(user));\n }\n }, [user?.Units, user?.TempUnit, user?.PressureUnit, user?.WindUnit, user?.ActiveLocation?.Locality?.SlugName]);\n\n useEffect(() => {\n if (\n serializedUserForCookie &&\n getCookie(userStateCookieName) !== serializedUserForCookie &&\n userStateCookieName\n ) {\n setCookieOnClient(\n userStateCookieName,\n serializedUserForCookie,\n DateTime.utc().plus({ years: 30 }).toJSDate()\n );\n }\n }, [serializedUserForCookie, userStateCookieName, user]);\n\n useEffect(() => {\n if (loggedInUserName) {\n setCookieOnClient(\n EM_LOGGED_IN_USER_PROFILE_COOKIE_NAME,\n loggedInUserName,\n DateTime.utc().plus({ days: 60 }).toJSDate()\n );\n }\n }, [loggedInUserName]);\n\n const shouldDisplayDailyContent =\n currentRoutePathname.startsWith(FORECAST_PATHNAMES.daily) &&\n forcastDaily &&\n isValidArray(forcastDaily) &&\n forcastDaily?.length > 0;\n\n if (currentRoutePathname.startsWith(FORECAST_PAGES_BASE_PATH)) {\n return (\n <>\n {currentRoutePathname.startsWith(FORECAST_PATHNAMES.daily) ? (\n }\n tenDayForecastPageDateHeaderComponentUI={\n shouldDisplayDailyContent ? (\n \n ) : null\n }\n tenForecastListComponentUI={\n shouldDisplayDailyContent ? (\n \n ) : (\n \n )\n }\n />\n ) : null}\n {\n currentRoutePathname.startsWith(FORECAST_PATHNAMES.hourly) && hourlyForecastSubNavDays ? (\n }\n forecastSubNavigationMenuUI={\n hourlyForecastSubNavDays ? (\n \n ) : null\n }\n dynamicHourlyForecastListComponentUI={\n activeHourlyForecastTab?.filteredDayHourlyForecastList?.length ? (\n \n ) : (\n \n )\n }\n />\n ) : null // error UI here\n }\n {\n currentRoutePathname.startsWith(FORECAST_PATHNAMES.now) ? <>{/** Now Page Content here */} : null // error UI here\n }\n \n );\n }\n\n // TODO: Handle error case - this should rarely happen\n return <>{/* Error UI Here*/};\n};\n"],"names":["Promise","resolve","then","__webpack_require__","bind","setCookieOnClient","cookieName","cookieValue","expirationDate","setCookie","domain","getDomain","hostname","window","location","includes","httpOnly","path","expires","Error","title","description","adSlotId","param","jsx_runtime","jsxs","Container","jsx","GenericError","AdContainer","DisplayAdWidgetWrapper","width","height","slotId","is300x250Ad","styled","div","withConfig","entityManagementSettingValues","DirectionUnit","degree","DistanceUnit","miles","SpeedUnit","milesPerHour","PrecipitationRateUnit","InchesPerHour","PrecipitationUnit","inches","TemperatureUnit","fahrenheit","PressureUnit","inchesOfMercury","parseAndFormatISO8601DateStr","isoDateStr","format","setZone","timezone","dateTime","DateTime","fromISO","isValid","toFormat","error","console","getWeekday","isoDateTimeStr","weekday","generateLowHighDisplay","displayTemp","DEFAULT_FORECAST_VALUE","isValidNumber","temp","concat","generateDayNightDisplayText","isNight","isToday","TONIGHT_TEXT","NIGHT_TEXT","TODAY_TEXT","DAY_TEXT","generateIconURLFromTemplate","iconCode","forecastIconUrlTemplate","replace","shouldShowSunriseOrSunset","hourlyCardDate","solarDate","shouldShow","hourlyCardTime","nextHourAfterSunsrise","sunriseTime","plus","hours","startOf","hour","SunriseSunsetHourlyListItem","sunriseDisplayString","sunriseLocalDateIsoString","sunsetDisplayString","sunsetLocalDateIsoString","Image","src","alt","loading","SunriseSunsetTime","time","theme","colors","base","fonts","sourceSans3FontFamily","getWindDirection","windDirectionDegrees","Math","round","HourlyDisclosureDetails","feelsLikeTemperature","relativeHumidity","dewPointTemperature","windDirection","windSpeed","feelsLikeDisplay","Number","isFinite","relativeHumidityDisplay","dewPointTemperatureDisplay","formattedWind","windSpeedDisplay","windDirectionAndSpeedDisplay","ForecastDetailsWithLinkSection","SubDetailContainer","aria-label","SubDetailData","SubDetailDataDescription","dir","Fragment","DegreeSymbol","strongText","sup","WeatherForecastIcon","iconSrc","iconImageAlt","sizes","priority","imgSrc","setImgSrc","useState","hasAttemptedFallback","setHasAttemptedFallback","ImageContainer","imageContainerHeight","imageContainerWidth","fill","placeholder","blurDataURL","style","objectFit","onError","fallbackIconUrl","URL","searchParams","set","toString","SummaryContainer","summary","mediaQueries","mobile","CaretContainer","rotationDeg","isInteger","DateDisplay","forecastDateLocalStr","dateDisplay","DateDetails","formatedDateDisplay","TimePart","h2","HourTemperatureDisplay","hourTemperature","tempDisplayText","temperatureAria","TempDisplay","span","HourlyDisclosureSummaryDetails","isOpen","iconURL","hourForecastDetailDescription","precipProbabability","hourlyTemperature","caretIconRotation","ArrowDirections","Up","Down","precipDisplay","HourlyListItemSummaryContainer","CollapsedSummaryContentWrapper","ForecastSummaryDetails","SummaryDetailsTopInfo","SummaryDetailsBottomInfoContainer","ForecastDetailDescriptionItem","HourForecastPrecipDescription","ArrowIcon","strokeColor","HourlyForecastDisclosureListItem","children","temperature","expandFirstCard","detailsRef","useRef","setIsOpen","useEffect","current","open","ref","onToggle","ExpandedForecastContent","details","greyTertiary","HourlyForecastList","hourlyWeatherForecastAPIData","solar","didShowSunrise","didShowSunset","map","forecast","index","srds","fdtolcl","srdtolcl","d","app","t","ic","flt","rh","wd","ws","dpt","MobileAdContainer","isInfiniteScrollAd","HOURLY_FORECAST_PAGE_LIST_ITEMS_AD_CONFIGS_300_250_1_LIST","desktop","HOURLY_FORECAST_PAGE_LIST_ITEMS_AD_CONFIGS_300_250_2_LIST","ssds","ssdtolcl","TenDayForecastDetailItem","dayNightDisplayText","intp","DetailHeader","IconDayInfo","DayNightInfo","TemperatureReading","DetailDescription","dd","p","TenDayForecastDetailItemLink","linkURL","useTheme","href","prefetch","LinkText","HOURLY_DETAILS_TEXT","Right","chevronLinkBlue","Link","TenDayForecastDisclosureDayNightDetails","day","night","hourlyForecastPageLink","showHourlyForecastPageLink","DayNightDetails","isNightTimePeriod","isSummaryDisplayOpen","dayNightInfo","HighLowDisplay","tempHigh","tempLow","highDisplayText","lowDisplayText","highTempAria","lowTempAria","AccessibilityContainer","aria-hidden","TempHigh","TempLow","TenDayDisclosureSummaryDetails","forecastSummaryDetails","dayTempHigh","nightTempLow","caretIconTitle","ExpandedSummaryContainer","id","CollapsedSummaryContainer","SummaryDetailsBottomInfo","ForecastDisclosureListItem","WeekendBoundary","VisuallyHidden","WEEKEND_BOUNDARY","SeparatorDot","attrs","role","TenDayForecastList","rawDailyWeatherForecastAPIData","currentLocationSlugName","enableNewHourlyForecastLinksOn10DayPage","renderableDailyForecastData","generateRenderableDailyForecastListUIData","dailyForecastDataGroup","result","lastGroupWeekday","forecastCount","length","group","currentDayOfWeek","fdls","wasLastWeekend","push","type","position","item","forecastIndex","nextGroup","nextDay","createDailyForecastListItemGroupsFromAPIData","rawAPIData","dailyForecastListItemGroups","currentIndex","day1","night1","dayTime","nightTime","firstForecastItemIsNightTime","dailyForecastUIItemData","DAILY_FORECAST_PAGE_LIST_ITEMS_AD_CONFIGS","firstItemInEachForecastGroup","dayItemIndex","secondItemInEachForecastGroup","hourCardSlug","getDayForecastItemHourCardSlug","isValidString","dateTimeObj","FORECAST_PATHNAMES","hourly","sd","undefined","forecastStartDateFormat","forecastEndDateFormat","TenDayForecastPageDateHeader","forecastPeriodStart","forecastPeriodEnd","startDate","endDate","ScreenReaderOnly","TimeDisplay","Separator","ForecastPageHeader","pageHeader","HeaderWrapper","HeaderText","h1","HourlyForecastSectionContentV2","forecastSubNavigationMenuUI","forecastPageHeaderComponentUI","dynamicHourlyForecastListComponentUI","SectionLayoutContainer","ContentHeader","SubMenu1","ForecastInfo","SubMenu2","section","TenDayForecastSectionContentV2","tenForecastListComponentUI","tenDayForecastPageDateHeaderComponentUI","TenDayForecastDateHeaderWrapper","HourlyForecastDayNavigation","days","activeLocationSlugName","activeTabIndex","pathname","usePathname","activeNavItemRef","scrollableNavContainer","reqAnimationId","requestAnimationFrame","scrollContainer","activeItem","navContainerWidth","offsetWidth","itemLeft","offsetLeft","itemWidth","scrollTo","left","max","behavior","cancelAnimationFrame","NavContainer","isActiveTab","dateQueryParam","DayLink","$isActiveHourlyLink","formattedSelectedNavDateDisplay","formattedUnSelectedNavDateDisplay","nav","robotoFontFamily","brandBg","nightShade","ForecastDetailsWrapper","user","forcastDaily","activeHourlyForecastTab","currentRoutePathname","userStateCookieName","serializedUserForCookie","loggedInUserName","weatherForecastIconTemplateUrl","hourlyForecastSubNavDays","hourlySolar","routeInfo","pageHeaderDisplayText","dispatch","useAppDispatch","initialServerDataSetToReduxState","prevUserUnits","Units","TempUnit","WindUnit","useLayoutEffect","DeviceId","ActiveLocation","Id","setInitialUserProfile","setPageRouteInfo","Locality","SlugName","getCookie","utc","years","toJSDate","EM_LOGGED_IN_USER_PROFILE_COOKIE_NAME","shouldDisplayDailyContent","startsWith","daily","isValidArray","FORECAST_PAGES_BASE_PATH","activeDayIndex","filteredDayHourlyForecastList","now"],"sourceRoot":""}