{"version":3,"file":"static/chunks/38-ac035032d9238298.js","mappings":"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","sources":["webpack://_N_E/./components/login-modal/login-modal.tsx","webpack://_N_E/./components/use-points/display-points-mvt/display-points.tsx","webpack://_N_E/./components/use-points/use-points.tsx","webpack://_N_E/./components/sort-by-drop-down/dropdown-ui.tsx","webpack://_N_E/./components/sort-by-drop-down/sort-by-drop-down.tsx","webpack://_N_E/./components/sort-by-drop-down/index.ts","webpack://_N_E/./components/zoom-in-for-pricing/zoom-in-for-pricing.tsx","webpack://_N_E/./components/zoom-in-for-pricing/index.ts","webpack://_N_E/./components/map/map.context.tsx","webpack://_N_E/./components/map/map.info-window.tsx","webpack://_N_E/./components/map/map.marker.tsx","webpack://_N_E/./components/map/map.static-marker.tsx","webpack://_N_E/./components/map/map.markers.tsx","webpack://_N_E/../../libs/osc/map/src/lib/info-window/map-info-window.tsx","webpack://_N_E/../../libs/osc/map/src/lib/info-window/index.ts","webpack://_N_E/../../libs/osc/map/src/lib/index.ts","webpack://_N_E/../../libs/osc/map/src/index.ts","webpack://_N_E/./components/map/map.markers.search.tsx","webpack://_N_E/./components/map/map.base.tsx","webpack://_N_E/./components/map/map.provider.tsx","webpack://_N_E/./components/map/map.tsx","webpack://_N_E/./components/map/map.markers.locations.tsx","webpack://_N_E/./components/map/map-block.tsx","webpack://_N_E/./components/map/map.module.css","webpack://_N_E/./hooks/use-vertical-space-MVT.ts","webpack://_N_E/./components/use-points/display-points-mvt/points-message.tsx","webpack://_N_E/./components/hotel-counter/hotel-counter.tsx","webpack://_N_E/./components/hotel-counter/index.ts","webpack://_N_E/./components/list-view/log-in-banner/log-in-banner.tsx","webpack://_N_E/./components/locations-page/locations-page.utils.ts","webpack://_N_E/./components/locations-page/locations-page-heading.tsx","webpack://_N_E/./components/hotel-search-result-summary/hotel-search-result-summary.tsx","webpack://_N_E/./components/compare-hotels/compare-hotel-utils.ts","webpack://_N_E/./components/compare-hotels/hooks/use-get-compare-hotels.ts","webpack://_N_E/./components/compare-hotels/compare-skeleton.tsx","webpack://_N_E/./components/compare-hotels/compare-modal.tsx","webpack://_N_E/./components/compare-hotels/compare-bar.tsx","webpack://_N_E/../../libs/osc/pagination/src/lib/pagination.tsx","webpack://_N_E/../../libs/osc/pagination/src/index.ts","webpack://_N_E/./hooks/use-hotel-summary-options/utils/filter-state-country-brand-hashed-hotels.ts","webpack://_N_E/./hooks/use-hotel-summary-options/utils/generate-hotel-summary-options-query-array.ts","webpack://_N_E/./utils/get-bounds-nodes/get-bounds-nodes.ts","webpack://_N_E/./hooks/use-hotel-summary-options/use-quad-nodes.ts","webpack://_N_E/./hooks/use-hotel-summary-options/use-blob.ts","webpack://_N_E/./hooks/use-hotel-summary-options/use-hotel-summary-options.ts","webpack://_N_E/./components/map-list-toggle-button/map-list-toggle-button.tsx","webpack://_N_E/./components/list-view/list-view-utils/list-view-brand-banner.utils.ts","webpack://_N_E/./components/list-view/list-view-brand-banner/list-view-brand-banner.tsx","webpack://_N_E/./components/list-view/list-view-brand-banner/index.ts","webpack://_N_E/./components/age-based-modal/age-based-modal-utils.ts","webpack://_N_E/./components/age-based-modal/age-based-modal.tsx","webpack://_N_E/./components/age-based-modal/index.ts","webpack://_N_E/./components/list-view/list-view-utils/list-view.utils.ts","webpack://_N_E/./hooks/use-get-visible-in-bound-hotels.ts","webpack://_N_E/./components/carousel/carousel.tsx","webpack://_N_E/./components/compare-hotels/compare-checkbox.tsx","webpack://_N_E/./components/hotel-card/key-hotel-amenity-info.tsx","webpack://_N_E/./components/hotel-card/hooks/use-view-hotel-details-link-mvt.ts","webpack://_N_E/./components/hotel-card/hotel-card.tsx","webpack://_N_E/./components/hotel-card/hotel-card-cta-skeleton.tsx","webpack://_N_E/./components/hotel-card/hotel-card-skeleton.tsx","webpack://_N_E/./components/hotel-card/hooks/use-dynatrace-log-warnings.ts","webpack://_N_E/./components/hotel-card/hotel-cards-warning-msg.tsx","webpack://_N_E/./components/hotel-card/hotel-cards.tsx","webpack://_N_E/./components/list-view/list-view.tsx","webpack://_N_E/./components/currency-converter/currency-converter.tsx","webpack://_N_E/../../libs/utilities/images/src/lib/get-aspect-ratio-url.ts","webpack://_N_E/../../libs/utilities/images/src/index.ts","webpack://_N_E/./components/info-message-banner/info-message-banner.tsx","webpack://_N_E/./hooks/use-suggested-filters.ts","webpack://_N_E/./components/filters/suggested-filters.tsx","webpack://_N_E/./components/compare-hotels/compare-toggle.tsx"],"sourcesContent":["import { Dialog } from '@dx-ui/osc-dialog-v2';\nimport { LoginIFrame, type LoginResponse } from '@dx-ui/osc-login';\nimport { generateSigninUrl, persistSessionState } from '../../utils';\nimport { useCallback } from 'react';\nimport { useAuth } from '@dx-ui/framework-auth-provider';\nimport { env } from '../../constants';\nimport { useWrappedRouter } from '../../hooks';\nimport { useAppState } from '../../providers/app-provider';\nimport { useFilterState } from '../../providers/filter-provider';\n\nexport const LoginModal = ({\n  onClose,\n  onLogin,\n  showLoginModal,\n  title,\n}: {\n  onClose: () => void;\n  onLogin?: () => void;\n  showLoginModal: boolean;\n  title: string;\n}) => {\n  const { login } = useAuth();\n  const { router } = useWrappedRouter();\n  const { shouldUsePoints, selectedCurrency, sortType } = useAppState();\n  const activeFiltersState = useFilterState();\n  const lang = router.locale as string;\n  const forgetInfoUrl = env.PARTNER_FORGET_INFO_LINK.replace('/__LANG__/', `/${lang}/`);\n  const options = {\n    showCreatePassword: false,\n    forgetInfoLink: { url: forgetInfoUrl },\n    secureInfoLink: { url: env.GLOBAL_PRIVACY_URL },\n    signInLink: { url: generateSigninUrl(router.asPath, lang) },\n  };\n  const onSignInAttempt = useCallback(\n    async (resp: LoginResponse) => {\n      persistSessionState({ shouldUsePoints, selectedCurrency, sortType, activeFiltersState });\n      if (resp?.data) {\n        await login(resp);\n      }\n    },\n    [activeFiltersState, login, selectedCurrency, shouldUsePoints, sortType]\n  );\n  const handleLogin = async (resp: LoginResponse) => {\n    await onSignInAttempt?.(resp);\n    if (!resp.error) {\n      onClose();\n      onLogin?.();\n    }\n  };\n  return (\n    <Dialog isOpen={showLoginModal} onDismiss={onClose} size=\"md\" title={title}>\n      <LoginIFrame\n        data-testid=\"loginIframe\"\n        frameSrc={generateSigninUrl(router?.asPath, lang)}\n        options={options}\n        onLoginAttempt={handleLogin}\n        onClose={onClose}\n        title={title}\n      />\n    </Dialog>\n  );\n};\n","import { useAuth } from '@dx-ui/framework-auth-provider';\nimport { DISPLAY_NUM_OF_AVAILABLE_POINTS, GOALS } from '../../../constants';\nimport { useGetMVTSelections, useWrappedRouter } from '../../../hooks';\nimport { useAppState } from '../../../providers/app-provider';\nimport { Trans, useTranslation } from 'next-i18next';\n\nimport { useState } from 'react';\nimport { LoginModal } from '../../login-modal/login-modal';\nimport { PointsMessage } from './points-message';\nimport { logError } from '@dx-ui/framework-logger';\nimport { sendReward } from '@dx-ui/framework-conductrics';\n\nexport const DisplayPoints = () => {\n  const { t } = useTranslation('use-points');\n  const { shouldUsePoints } = useAppState();\n  const { isAuthenticated } = useAuth();\n  const [showLoginModal, setShowLoginModal] = useState(false);\n  const { router } = useWrappedRouter();\n\n  const {\n    isLoaded,\n    isMVTVariant: { b: isMVT },\n  } = useGetMVTSelections({\n    agentId: DISPLAY_NUM_OF_AVAILABLE_POINTS.agentId,\n    isProvisional: shouldUsePoints,\n  });\n\n  const onLogin = () => {\n    const params = new URLSearchParams(window.location.search);\n    params.set('redeemPts', 'true');\n    params.set('pointsLogin', 'true');\n    router\n      .replace(\n        {\n          pathname: router.pathname,\n          query: params.toString(),\n        },\n        undefined,\n        { shallow: true }\n      )\n      .catch((error) => logError('DISPLAY_POINTS', error, 'Error redirecting to login page'));\n  };\n\n  const handleSignInButtonClick = () => {\n    setShowLoginModal(true);\n    sendReward(GOALS.pointsLoginClick);\n  };\n\n  const buttonLabel = t('SRSignInToBookWithPoints');\n  if (!isMVT || !isLoaded) return null;\n  return isAuthenticated ? (\n    <PointsMessage />\n  ) : (\n    <>\n      <div className=\"text-nowrap text-sm text-tier-diamond\">\n        <Trans\n          ns=\"use-points\"\n          i18nKey=\"signInToBookWithPoints\"\n          components={{\n            SignInLink: (\n              <button\n                onClick={handleSignInButtonClick}\n                type=\"button\"\n                className=\"font-normal underline\"\n                aria-label={buttonLabel}\n                aria-live=\"polite\"\n              >\n                Sign in now\n              </button>\n            ),\n          }}\n        />\n      </div>\n      <LoginModal\n        showLoginModal={showLoginModal}\n        onClose={() => setShowLoginModal(false)}\n        onLogin={onLogin}\n        title={t('signInNowToPay')}\n      />\n    </>\n  );\n};\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useGetUsePoints, useMetrics, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { InfoPopup } from '@dx-ui/osc-info-popup';\nimport { useIsClient } from 'usehooks-ts';\nimport { DisplayPoints } from './display-points-mvt/display-points';\nimport { useState } from 'react';\nimport { useCurrencyConversion } from '@dx-ui/osc-currency-converter';\n\nexport type UsePointsProps = {\n  isInvalidOrUnavailableOffer?: boolean;\n  onChange?: () => void;\n};\n\nexport const UsePoints = ({ isInvalidOrUnavailableOffer, onChange }: UsePointsProps) => {\n  const { router } = useWrappedRouter();\n  const { t } = useTranslation('use-points');\n  const { shouldUsePoints, selectedCurrency } = useAppState();\n  const dispatch = useAppDispatch();\n  const metrics = useMetrics();\n  const isClient = useIsClient();\n  const [a11yText, setA11yText] = useState('');\n  const { currenciesMap } = useCurrencyConversion();\n  const selecteCurrencyDesc = currenciesMap?.get(selectedCurrency || 'USD')?.description;\n\n  const {\n    isDisabled: isPointsDisabled,\n    isChecked: shouldUsePointsChecked,\n    infoPopupMessage,\n  } = useGetUsePoints(isInvalidOrUnavailableOffer);\n\n  const handleUsePointsChange = () => {\n    const a11yMessage = !shouldUsePointsChecked\n      ? t('priceChangeToPoints')\n      : t('rateChangedToCurrency', { currencyName: selecteCurrencyDesc });\n    setA11yText(a11yMessage);\n    dispatch({ type: 'SET_USE_POINTS', payload: !shouldUsePoints });\n    void metrics.trackUsePointsChecked();\n    if (onChange) onChange();\n    setTimeout(() => setA11yText(''), 1000);\n  };\n\n  return isClient && router.isReady ? (\n    <div className=\"ml-2 mr-0 flex-col pt-5 md:mx-2 md:px-2 rtl:mb-2\">\n      <div className=\"flex\">\n        <label className=\"label label-inline-reverse text-nowrap rtl:label-inline-reverse\">\n          <span\n            className={cx('text-sm font-semibold lg:text-lg rtl:pl-2 rtl:pr-1', {\n              'text-text-disabled': isPointsDisabled,\n            })}\n          >\n            {t('usePoints')}\n          </span>\n          <input\n            checked={shouldUsePointsChecked}\n            className=\"form-checkbox\"\n            data-testid=\"searchByUsePoints\"\n            disabled={isPointsDisabled}\n            onChange={handleUsePointsChange}\n            type=\"checkbox\"\n          />\n          {a11yText ? <span className=\"sr-only\">{a11yText}</span> : null}\n        </label>\n        {infoPopupMessage && (\n          <span className=\"m-1 flex\">\n            <InfoPopup testId=\"dayUseRateDisclaimer\" label={t('pointsInfo')}>\n              <span className=\"flex w-40\">{t(infoPopupMessage)}</span>\n            </InfoPopup>\n          </span>\n        )}\n      </div>\n      <DisplayPoints />\n    </div>\n  ) : null;\n};\n","import type * as React from 'react';\nimport { isBrowser } from '@dx-ui/utilities-is-browser';\nimport { useIsClient } from 'usehooks-ts';\nimport getBreakpoint from '../../utils/get-breakpoint';\nimport type { LabelValue } from '../../utils';\n\ntype DropdownProps = {\n  options: LabelValue[];\n  handleChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;\n  value?: string | number | readonly string[];\n  label: string;\n};\nconst Dropdown = ({ options, handleChange, value, label }: DropdownProps) => {\n  const isClient = useIsClient();\n  const isMobile = isBrowser && window.innerWidth < (getBreakpoint('sm', true) as number);\n\n  return isClient ? (\n    <div className=\"z-1 ml-2 mr-1 w-32 text-sm md:ml-0 md:w-64\" data-testid=\"sortByDropdown\">\n      <label\n        className=\"label mr-1 flex h-7 justify-center whitespace-nowrap pb-1 text-xs font-semibold tracking-tight md:text-sm rtl:mx-0\"\n        htmlFor=\"selectSortBy\"\n      >\n        {label}\n      </label>\n      <select\n        aria-label={label}\n        className=\"form-select w-32 text-sm leading-4 md:w-full md:text-base\"\n        data-testid=\"selectSortBy\"\n        id=\"selectSortBy\"\n        name={label}\n        onChange={(evt) => handleChange(evt)}\n        role=\"presentation\"\n        style={{ ...(isMobile && { margin: 0 }) }}\n        title={label}\n        value={value}\n      >\n        {options?.map(\n          (option) =>\n            !!option.isVisible && (\n              <option\n                data-testid={option.testIdLabel}\n                disabled={option.isDisabled}\n                key={option.value}\n                value={option.value}\n              >\n                {option.label}\n              </option>\n            )\n        )}\n      </select>\n    </div>\n  ) : null;\n};\n\nexport default Dropdown;\n","import type * as React from 'react';\nimport type { SortByDropDownValues } from '../../utils';\nimport { isSortByPoints, isSortByPrice } from '../../utils';\nimport Dropdown from './dropdown-ui';\nimport { useMetrics, useGetSortByOptions } from '../../hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useAppState, useAppDispatch } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\n\ntype SortByDropDownProps = {\n  isInvalidOrUnavailableOffer?: boolean;\n  onChange?: () => void;\n  filteredHotelCount?: number;\n};\n\nexport const SortByDropDown = ({\n  filteredHotelCount,\n  isInvalidOrUnavailableOffer,\n  onChange,\n}: SortByDropDownProps) => {\n  const { t } = useTranslation('sort-by-drop-down');\n  const { sortType, shouldUsePoints } = useAppState();\n  const dispatch = useAppDispatch();\n\n  const metrics = useMetrics();\n\n  const { sortByOptions: sortOptions } = useGetSortByOptions({\n    filteredHotelsCount: filteredHotelCount,\n    isInvalidOrUnavailableOffer,\n  });\n\n  const handleUsePointsOnSortChange = (sortBy: SortByDropDownValues) => {\n    //When switching to -> Points andshouldUsePointsis not selected, force usePoints select\n    if (isSortByPoints(sortBy) && !shouldUsePoints) {\n      dispatch({ type: 'SET_USE_POINTS', payload: true });\n    }\n    //When switching to -> Price  andshouldUsePointsis selected, force usePoints de-select\n    if (isSortByPrice(sortBy) && shouldUsePoints) {\n      dispatch({ type: 'SET_USE_POINTS', payload: false });\n    }\n    return;\n  };\n\n  const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n    dispatch({ type: 'SET_SORT_TYPE', payload: event.target.value as SortByDropDownValues });\n    dispatch({ type: 'SET_PAGINATION_INDEX', payload: 0 });\n    sendReward(GOALS.sortEngagement);\n    metrics.propertySearchSort(event.target.value);\n    if (onChange) {\n      onChange();\n    }\n    handleUsePointsOnSortChange(event.target.value as SortByDropDownValues);\n  };\n\n  if (sortType === null || !sortOptions.length) return null;\n\n  return (\n    <Dropdown\n      handleChange={handleChange}\n      label={t('label')}\n      options={sortOptions}\n      value={sortType}\n    />\n  );\n};\n","export * from './sort-by-drop-down';\n","import { useTranslation } from 'next-i18next';\n\nexport const ZoomInForPricing = () => {\n  const { t } = useTranslation('zoom-in-for-additional-pricing');\n\n  return (\n    <span className=\"absolute z-2 mt-4 w-28 text-wrap rounded-lg border border-text-alt bg-text/75 px-2 py-0.5 text-center text-sm text-text-inverse @[400px]:w-auto @[460px]:mt-3 max-2xl:top-12\">\n      {t('zoomInForAdditionalPricing')}\n    </span>\n  );\n};\n","export * from './zoom-in-for-pricing';\n","import { createContext, useContext } from 'react';\nimport type MarkerClusterer from '@googlemaps/markerclustererplus';\n\ntype IMapContext = {\n  apiKey?: string;\n  clusterer?: MarkerClusterer;\n  infoWindow?: google.maps.InfoWindow;\n  infoWindowContainer?: HTMLDivElement;\n  map?: google.maps.Map;\n  setClusterer: (clusterer?: MarkerClusterer) => void;\n  setInfoWindow: (infoWindow?: google.maps.InfoWindow) => void;\n  setInfoWindowContainer: (infoWindowContainer?: HTMLDivElement) => void;\n  setMap: (map?: google.maps.Map) => void;\n};\n\nconst defaultContext: IMapContext = {\n  apiKey: undefined,\n  clusterer: undefined,\n  infoWindow: undefined,\n  infoWindowContainer: undefined,\n  map: undefined,\n  setClusterer: () => null,\n  setInfoWindow: () => null,\n  setInfoWindowContainer: () => null,\n  setMap: () => null,\n};\n\nexport const MapContext = createContext<IMapContext>(defaultContext);\n\nexport const useMap = () => {\n  const context = useContext(MapContext);\n  if (context === undefined) {\n    throw new Error('useMap must be used within an MapProvider');\n  }\n  return context;\n};\n","import type * as React from 'react';\nimport { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useMap } from './map.context';\n\ntype IMapInfoWindow = {\n  children: React.ReactNode;\n  /**\n   * This event is fired when the close button is clicked.\n   */\n  onCloseClick?: () => void;\n  position: google.maps.InfoWindowOptions['position'];\n};\n\n/**\n * Used as a wrapper to insert any React Component into\n */\nconst MapInfoWindow = ({ children, onCloseClick, position }: IMapInfoWindow) => {\n  const { infoWindow, infoWindowContainer } = useMap();\n\n  useEffect(() => {\n    if (infoWindow) {\n      if (position) {\n        infoWindow.setPosition(position);\n      }\n      if (onCloseClick) {\n        infoWindow.addListener('closeclick', onCloseClick);\n      }\n    }\n    return () => {\n      if (infoWindow) {\n        google.maps.event.clearListeners(infoWindow, 'closeclick');\n      }\n    };\n  }, [infoWindow, children, onCloseClick, position]);\n\n  return infoWindowContainer ? createPortal(children, infoWindowContainer) : null;\n};\n\nexport default MapInfoWindow;\n","import type * as React from 'react';\n\nexport type MapMarkerColor = {\n  active: string;\n  inactive: string;\n};\n\nexport const MAP_MARKER_COLOR: Record<string, MapMarkerColor> = {\n  POINTS_EXPLORER: { active: '#601b45', inactive: '#84235e' } as const,\n  DEFAULT: { active: 'rgb(0 22 59)', inactive: 'rgb(0 47 97)' } as const,\n} as const;\n\nexport type IMapMarker = {\n  /**\n   * if `iconActive` is provided, this will switch to use that icon\n   */\n  isActive?: boolean;\n  id: string | number;\n  icon?: string;\n  label?: string;\n  children: React.ReactNode;\n  color?: MapMarkerColor;\n  /**\n   * This event is fired when the marker is clicked.\n   */\n  onClick?: () => void;\n  onMouseOver?: () => void;\n  onMouseOut?: () => void;\n  markerOptions?: google.maps.MarkerOptions;\n  position: google.maps.MarkerOptions['position'];\n};\n\nconst MapMarker = ({ isActive, children }: IMapMarker) => (isActive ? children : null);\n\nexport default MapMarker;\n","import { useRef, useEffect } from 'react';\nimport { useMap } from './map.context';\n\nexport type IMapStaticMarker = {\n  icon?: google.maps.MarkerOptions['icon'];\n  position: google.maps.MarkerOptions['position'];\n  shouldShowCenterMarker?: boolean;\n};\n\nconst MapStaticMarker = ({ icon = '', position, shouldShowCenterMarker }: IMapStaticMarker) => {\n  const { map } = useMap();\n  const centerMarker = useRef<google.maps.Marker | null>(null);\n\n  useEffect(() => {\n    if (map && position) {\n      //if marker already drawn remove it.\n      if (centerMarker.current) centerMarker.current.setMap(null);\n\n      //draw new center marker on map\n\n      centerMarker.current = shouldShowCenterMarker\n        ? new google.maps.Marker({\n            icon,\n            map,\n            position,\n          })\n        : null;\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [icon, map, JSON.stringify(position)]);\n\n  return null;\n};\n\nexport default MapStaticMarker;\n","import { useEffect, useRef, useState } from 'react';\nimport * as React from 'react';\nimport { useMap } from './map.context';\nimport type { IMapMarker, MapMarkerColor } from './map.marker';\nimport { MAP_MARKER_COLOR } from './map.marker';\nimport type { IMapStaticMarker } from './map.static-marker';\nimport type { ClusterIconStyle, MarkerClustererOptions } from '@googlemaps/markerclustererplus';\nimport MarkerClusterer from '@googlemaps/markerclustererplus';\n\nlet MARKER_Z_INDEX = 1;\n/**\n * Dynamically generates the price marker shape using SVG path syntax\n */\nconst getPriceMarkerPath: (width: number) => string = (width) => {\n  const height = 15;\n  const radius = 4;\n  const tailHeight = 10;\n  const tailWidth = 10;\n  return `\n    M 0 0\n    l -${tailWidth / 2} -${tailHeight}\n    h -${width / 2 - tailWidth / 2}\n    a ${radius} ${radius} 0 0 1 -${radius} -${radius}\n    v -${height}\n    a ${radius} ${radius} 0 0 1 ${radius} -${radius}\n    h ${width}\n    a ${radius} ${radius} 0 0 1 ${radius} ${radius}\n    v ${height}\n    a ${radius} ${radius} 0 0 1 -${radius} ${radius}\n    h -${width / 2 - tailWidth / 2}\n    z`;\n};\n/**\n * Generates a marker with text overlayed on top of it\n * @param label - the text to display on the marker\n */\nconst getPriceMarker = (\n  label: string,\n  isActive: boolean,\n  color?: MapMarkerColor\n): google.maps.Symbol => {\n  const estimatedAverageCharacterWidth = 8;\n  const width = label.length * estimatedAverageCharacterWidth;\n  const defaultColor = MAP_MARKER_COLOR['DEFAULT'];\n  return {\n    path: getPriceMarkerPath(width),\n    scale: 1,\n    fillColor: isActive\n      ? color?.active || defaultColor?.active\n      : color?.inactive || defaultColor?.inactive,\n    fillOpacity: 1,\n    strokeColor: 'rgb(228 228 228)',\n    strokeWeight: 1.2,\n    labelOrigin: new google.maps.Point(0, -22),\n  };\n};\n\ntype IMapMarkers = {\n  children: React.ReactNode;\n  clusterOptions?: MarkerClustererOptions;\n  /**\n   * If using an infoWindow, you must provide this prop in order to have it be closed when there is no active selection\n   */\n  activeMarker: IMapMarker['id'] | null;\n  iconClusterPath?: ClusterIconStyle['url'];\n};\ntype ModifiedMarker = { id?: string } & google.maps.MarkerOptions;\n\nconst MapMarkers = ({ children, clusterOptions, activeMarker, iconClusterPath }: IMapMarkers) => {\n  const { map, clusterer, setClusterer, infoWindow } = useMap();\n  const { current: markers } = useRef<Map<string, ModifiedMarker>>(new Map());\n  const [staticMarker, setStaticMarker] = useState<React.ReactNode>(null);\n\n  const markersToDisplay = React.useMemo(\n    () =>\n      React.Children.map(children, (child) => {\n        if (React.isValidElement<IMapMarker>(child)) {\n          // this is reducing the time it takes the add/remove marker useEffect to run by just under 1 sec per run\n          const { children: _children, ...propsWithoutChildren } = child.props;\n          return propsWithoutChildren;\n        }\n        if (React.isValidElement<IMapStaticMarker>(child)) {\n          setStaticMarker(child);\n        }\n        return null;\n      })?.filter(Boolean) as IMapMarker[],\n    [children]\n  );\n  const getMarker = (id?: IMapMarker['id']) =>\n    markers.get(id as string) as google.maps.Marker | undefined;\n  const addMarker = (m: IMapMarker) => {\n    if (map && m) {\n      const marker = new google.maps.Marker({\n        id: m.id,\n        icon: m.label\n          ? getPriceMarker(m.label, !!m.isActive, m.color)\n          : { url: m.icon, scaledSize: new google.maps.Size(22, 30) },\n        label: m.label\n          ? { text: m.label, color: '#ffffff', fontWeight: 'bold', fontFamily: 'Hilton Sans' }\n          : undefined,\n        position: m.position,\n        optimized: false,\n        visible: true,\n        zIndex: MARKER_Z_INDEX++,\n        clickable: true,\n        ...m.markerOptions,\n      } as ModifiedMarker);\n      let originalZindex = marker.getZIndex();\n      marker.addListener('mouseover', () => {\n        originalZindex = marker.getZIndex();\n        marker.setZIndex(MARKER_Z_INDEX + 1000);\n        if (m.onMouseOver) {\n          m.onMouseOver();\n        }\n      });\n      marker.addListener('mouseout', () => {\n        if (originalZindex) marker.setZIndex(originalZindex);\n        if (m.onMouseOut) {\n          m.onMouseOut();\n        }\n      });\n      marker.addListener('click', () => {\n        marker.setZIndex(MARKER_Z_INDEX + 1000);\n        if (m.onClick) {\n          m.onClick();\n        }\n      });\n      markers.set(m.id as string, marker as ModifiedMarker);\n      return marker;\n    }\n  };\n  const removeMarker = (marker: google.maps.Marker) => {\n    if (map && marker) {\n      google.maps.event.clearListeners(marker, 'mouseover');\n      markers.delete((marker as ModifiedMarker).id as string);\n      return marker;\n    }\n  };\n\n  useEffect(() => {\n    if (map && infoWindow) {\n      if (activeMarker) {\n        const mapMarker = getMarker(activeMarker);\n        if (mapMarker) {\n          infoWindow.open({\n            anchor: mapMarker as google.maps.MVCObject | google.maps.marker.AdvancedMarkerElement,\n            map: map as google.maps.Map | google.maps.StreetViewPanorama,\n            shouldFocus: false,\n          });\n        }\n      } else {\n        infoWindow.close();\n      }\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [map, infoWindow, activeMarker]);\n\n  useEffect(() => {\n    const shouldHaveCluster = iconClusterPath || clusterOptions;\n    if (map) {\n      if (shouldHaveCluster && !clusterer) {\n        setClusterer(\n          new MarkerClusterer(map, [], {\n            averageCenter: true,\n            minimumClusterSize: 4,\n            maxZoom: 9,\n            ignoreHidden: true,\n            styles: [\n              {\n                textSize: 16,\n                textColor: '#fff',\n                url: iconClusterPath,\n                height: 53,\n                width: 53,\n                anchorText: [16, 0],\n              },\n            ],\n            ...(clusterOptions || {}),\n          })\n        );\n        return;\n      }\n\n      // markers to update\n      markersToDisplay.forEach((m) => {\n        const marker = getMarker(m.id);\n        if (marker) {\n          // Anything that changes a label will require re-setting both label and icon on existing markers. Also update marker if icon state changes (no price => price marker for example)\n          marker.setIcon(\n            m.label\n              ? getPriceMarker(m.label, !!m.isActive, m.color)\n              : { url: m.icon || '', scaledSize: new google.maps.Size(22, 30) }\n          );\n          if (m.label !== marker.getLabel())\n            if (m.label)\n              marker.setLabel({\n                text: m.label,\n                color: '#ffffff',\n                fontWeight: 'bold',\n                fontFamily: 'Hilton Sans',\n              });\n            else marker.setLabel(null);\n        }\n      });\n      // markers to add (exclude any marker w/out an id as it doesnt represent a ctyhocn)\n      const markersToAdd = markersToDisplay\n        .filter(({ id }) => !getMarker(id as string))\n        .map((m) => addMarker(m))\n        .filter((m) => m !== undefined && !!(m as ModifiedMarker).id) as google.maps.Marker[];\n      if (clusterer) {\n        clusterer.addMarkers(markersToAdd);\n      } else {\n        markersToAdd.forEach((m) => {\n          m?.setMap(map);\n        });\n      }\n      // markers to remove\n      const toRemove = [...markers]\n        .filter(([id, _marker]) => !markersToDisplay.find((m) => m.id === id))\n        .map(([_id, marker]) => removeMarker(marker as google.maps.Marker))\n        .filter((m) => m !== undefined);\n\n      if (clusterer) {\n        clusterer.removeMarkers(toRemove);\n      } else {\n        toRemove.forEach((m) => {\n          m.setMap(null);\n        });\n      }\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [map, iconClusterPath, clusterOptions, clusterer, markersToDisplay]);\n\n  return (\n    <>\n      {staticMarker}\n      {children}\n    </>\n  );\n};\n\nexport default MapMarkers;\n","import type * as React from 'react';\nimport Image from 'next/legacy/image';\nimport { Link } from '@dx-ui/osc-link';\nimport { useMediaQuery } from 'usehooks-ts';\nimport cx from 'classnames';\n\nexport type InfoWindowProps = {\n  /**Full address of the property */\n  address?: string | null;\n  /**Brand code to render brand logo bug */\n  brandCode?: string;\n  /** pill badges that flag exceptional attributes of the property such as\n   * if a property is new or having a sale\n   */\n  hotelBadges?: React.ReactNode;\n  /** Add additional Custom tailwind styling for info-window container */\n  containerClassName?: string;\n  /** Property ctyhocn */\n  ctyhocn: string | null;\n  /**Directions object -\n   * title - sting that will display as link text, suggest to pass returned t function string value.\n   * uri - link URI\n   */\n  directionsLink?: {\n    linkCopy: string;\n    url: string;\n  };\n  /** hotel name to be used as info-window title and logo bug alt*/\n  name?: string | null;\n} & React.ComponentProps<'div'>;\n\nexport const InfoWindow = ({\n  address,\n  brandCode,\n  children,\n  containerClassName,\n  ctyhocn,\n  directionsLink,\n  hotelBadges,\n  name,\n}: InfoWindowProps) => {\n  const isMobile = useMediaQuery('(max-width: 640px)');\n\n  return (\n    <div className={cx('max-w-sm bg-[#ffffff] text-[#121212] shadow-sm', containerClassName)}>\n      <div\n        className=\"flex max-w-xs rtl:flex-row-reverse\"\n        data-testid={`${ctyhocn}-mapMarkerContent`}\n      >\n        {brandCode ? (\n          <div className=\"order-first flex size-8 items-center text-center sm:size-12 rtl:order-last\">\n            <Image\n              alt={`${name || ctyhocn} logo`}\n              className=\"object-contain\"\n              src={`/modules/assets/svgs/logos/bug/${brandCode}.svg`}\n              height={isMobile ? 32 : 48}\n              width={isMobile ? 32 : 48}\n            />\n          </div>\n        ) : null}\n        <div className=\"flex flex-col items-start text-left\">\n          {name ? <div className=\"w-full px-2 py-1 text-sm font-bold\">{name}</div> : null}\n          {hotelBadges ? <div className=\"px-2 \">{hotelBadges}</div> : null}\n          {address ? <div className=\"w-full px-2 py-1 text-xs\">{address}</div> : null}\n          {directionsLink?.url && directionsLink?.linkCopy ? (\n            <Link url={directionsLink.url} isNewWindow={true} className=\"px-2 text-xs sm:text-sm\">\n              {directionsLink.linkCopy}\n            </Link>\n          ) : null}\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default InfoWindow;\n","export * from './map-info-window';\n","export * from './info-window';\n","export * from './lib';\n","import { useCallback, useMemo } from 'react';\n\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { isAffiliateHotel, useMetrics, useRenovationChip, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport type { GoogleCoordinate } from '../../utils';\nimport {\n  getCMAPrice,\n  getLengthOfStay,\n  isSpecialRatesDeeplinked,\n  prefixPublicAssetUriWithAppPrefix,\n} from '../../utils';\nimport { isLocalCurrencySameAsHotelCurrency } from '../hotel-card/utils/hotel-info-utils';\nimport MapInfoWindow from './map.info-window';\nimport MapMarker, { MAP_MARKER_COLOR } from './map.marker';\nimport MapStaticMarker from './map.static-marker';\nimport MapMarkers from './map.markers';\nimport type { HotelBadgeTypes } from '../hotel-card/hotel-badges';\nimport { HotelBadges } from '../hotel-card/hotel-badges';\nimport { InfoWindow } from '@dx-ui/osc-map';\nimport { formatAndConvertPrice, useCurrencyConversion } from '@dx-ui/osc-currency-converter';\nimport useShopMultiPropAvail from '../../hooks/use-shop-multi-prop-avail/use-shop-multi-prop-avail';\nimport { MAX_PRICE_PROPERTY_LIMIT } from '../../constants';\n\nexport const SearchMapMarkers = ({\n  centerCoordinate,\n  matchId,\n  sortedHotels,\n}: {\n  centerCoordinate: GoogleCoordinate | null;\n  matchId?: string | null;\n  sortedHotels: HotelType[];\n}) => {\n  const visibleHotels = sortedHotels\n    ?.slice(0, MAX_PRICE_PROPERTY_LIMIT - 1)\n    ?.map((hotel) => hotel.ctyhocn);\n\n  const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n  const hasSpecialRatesDeepLinked = useMemo(\n    () => isSpecialRatesDeeplinked(queryParameters),\n    [queryParameters]\n  );\n  const { hashedData: hashedMPAData, isLoading: isMPADataLoading } = useShopMultiPropAvail({\n    ctyhocns: visibleHotels,\n    enabled: hasSpecialRatesDeepLinked,\n  });\n\n  const {\n    activeProperty,\n    selectedCurrency,\n    selectedCtyhocn,\n    shouldUsePoints,\n    pageType,\n    hasSpecialRate,\n  } = useAppState();\n  const { currenciesError, currenciesMap } = useCurrencyConversion();\n  const dispatch = useAppDispatch();\n  const metrics = useMetrics();\n  const { isPointsExplorer } = pageType;\n  const { renoChipConfig } = useRenovationChip();\n\n  const handleMapMarkerClicked = useCallback(\n    (ctyhocn: string, name?: string | null) => {\n      dispatch({ type: 'SET_PDP_CTYHOCN', payload: ctyhocn });\n      metrics.setBrandDetail({\n        ctyhocn,\n        view: 'Map',\n        name: name || '',\n        index: 1,\n      });\n    },\n    [dispatch, metrics]\n  );\n  const showPointsInMarker = !hasSpecialRate && shouldUsePoints;\n  const propertySearch = matchId?.includes('dx-hotel::');\n  return (\n    <MapMarkers\n      activeMarker={activeProperty || selectedCtyhocn}\n      iconClusterPath=\"/modules/assets/svgs/map/cluster/HI.svg\"\n    >\n      {/** Do not render static center marker if specific property searched */}\n      <MapStaticMarker\n        icon={prefixPublicAssetUriWithAppPrefix('/assets/map-pin-active.png')}\n        position={centerCoordinate}\n        shouldShowCenterMarker={!propertySearch}\n      />\n      {!isMPADataLoading &&\n        sortedHotels.map(\n          ({ address, brandCode, localization, ctyhocn, name, leadRate, amenityIds, display }) => {\n            const badges: HotelBadgeTypes[] = [];\n            if (hashedMPAData?.[ctyhocn]?.summary?.lowest?.ratePlan?.attributes?.includes('sale'))\n              badges.push('sale');\n            if (amenityIds.includes('newHotel')) badges.push('new');\n            if (renoChipConfig?.includes(ctyhocn)) badges.push('recentlyRenovated');\n\n            const position = {\n              lat: localization?.coordinate?.latitude || 0,\n              lng: localization?.coordinate?.longitude || 0,\n            };\n            const hasConfidentialRate =\n              hashedMPAData?.[ctyhocn]?.summary?.lowest?.ratePlan?.confidentialRates;\n            const currentHotel = hashedMPAData[ctyhocn];\n            const isNotBookable =\n              hashedMPAData &&\n              currentHotel &&\n              ((currentHotel.summary?.status?.type === 'NOT_AVAILABLE' &&\n                !queryParameters?.datesFlex) ||\n                currentHotel.summary?.status?.type === 'NOT_OPEN');\n\n            // do not display prices/points when flexDates enabled or avail status is effectively not bookable. Fallback to price if pts not avail\n            const displayPriceInMarker =\n              !isNotBookable && !queryParameters?.datesFlex && !hasConfidentialRate;\n            const displayPointsInMarker = showPointsInMarker && displayPriceInMarker;\n            const { totalRate, totalRateFmt } = getCMAPrice({\n              cmaTotalPriceIndicator:\n                hashedMPAData?.[ctyhocn]?.summary?.lowest?.cmaTotalPriceIndicator,\n              rateAmount: hashedMPAData?.[ctyhocn]?.summary?.lowest?.rateAmount,\n              rateAmountFmt: hashedMPAData?.[ctyhocn]?.summary?.lowest?.rateAmountFmt,\n              totalRate: hashedMPAData?.[ctyhocn]?.summary?.lowest?.amountAfterTax,\n              totalRateFmt: hashedMPAData?.[ctyhocn]?.summary?.lowest?.amountAfterTaxFmt,\n              lengthOfStay: getLengthOfStay(\n                queryParameters?.departureDate,\n                queryParameters?.departureDate\n              ),\n            });\n\n            const markerPrice = hasConfidentialRate\n              ? undefined\n              : isLocalCurrencySameAsHotelCurrency(\n                  selectedCurrency,\n                  localization?.currencyCode || ''\n                )\n              ? totalRateFmt\n              : formatAndConvertPrice({\n                  basePrice: !totalRate ? undefined : totalRate,\n                  currencyQueryError: !!currenciesError,\n                  fromCurrency: currenciesMap?.get('USD'),\n                  language: router.locale,\n                  toCurrency: currenciesMap.get(selectedCurrency || ''),\n                }) || totalRateFmt;\n\n            const markerPointsOrPrice =\n              hashedMPAData?.[ctyhocn]?.summary?.hhonors?.dailyRmPointsRateFmt || markerPrice;\n\n            const pointsRangeLabel = leadRate?.hhonors\n              ? `${leadRate?.hhonors.min?.dailyRmPointsRateRoundFmt} - ${leadRate?.hhonors.max?.dailyRmPointsRateRoundFmt}`\n              : '';\n            const markerLabel =\n              sortedHotels.length > 150\n                ? undefined\n                : displayPointsInMarker\n                ? isPointsExplorer\n                  ? pointsRangeLabel\n                  : markerPointsOrPrice\n                : displayPriceInMarker\n                ? markerPrice\n                : undefined;\n\n            const isActive = activeProperty === ctyhocn || selectedCtyhocn === ctyhocn;\n            const suppressBrandLogo = isAffiliateHotel(display);\n            const icon =\n              isActive && !isNotBookable && !isPointsExplorer\n                ? prefixPublicAssetUriWithAppPrefix('/assets/map-pin-active.png')\n                : isActive && isNotBookable && !isPointsExplorer\n                ? prefixPublicAssetUriWithAppPrefix('/assets/map-pin-alt-active.png')\n                : isNotBookable && !isPointsExplorer\n                ? prefixPublicAssetUriWithAppPrefix('/assets/map-pin-alt.png')\n                : prefixPublicAssetUriWithAppPrefix('/assets/map-pin.png');\n\n            return (\n              <MapMarker\n                isActive={isActive}\n                color={\n                  !!isPointsExplorer ||\n                  (!!showPointsInMarker &&\n                    hashedMPAData?.[ctyhocn]?.summary?.hhonors?.dailyRmPointsRateFmt)\n                    ? MAP_MARKER_COLOR['POINTS_EXPLORER']\n                    : undefined\n                }\n                icon={icon}\n                id={ctyhocn}\n                key={`map-marker-item-${ctyhocn}`}\n                label={markerLabel || undefined}\n                onClick={() => handleMapMarkerClicked(ctyhocn, name)}\n                onMouseOut={() => dispatch({ type: 'UNSET_HIGHLIGHTED_MAP_CTYHOCN' })}\n                onMouseOver={() =>\n                  dispatch({ type: 'SET_HIGHLIGHTED_MAP_CTYHOCN', payload: ctyhocn })\n                }\n                position={position}\n              >\n                <MapInfoWindow\n                  onCloseClick={() => dispatch({ type: 'SET_PDP_CTYHOCN', payload: null })}\n                  position={position}\n                >\n                  <InfoWindow\n                    address={address ? `${address.addressLine1}, ${address.city}` : ''}\n                    brandCode={suppressBrandLogo ? undefined : brandCode || 'HI'}\n                    ctyhocn={ctyhocn}\n                    hotelBadges={<HotelBadges badges={badges} />}\n                    name={name || ''}\n                    containerClassName='w-56 sm:w-fit !font-[\"Hilton_Sans\"]'\n                  />\n                </MapInfoWindow>\n              </MapMarker>\n            );\n          }\n        )}\n    </MapMarkers>\n  );\n};\n","import * as React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { useMap } from './map.context';\nimport { MAPS_URL, MAX_ZOOM } from '../../constants';\nimport { isBrowser } from '@dx-ui/utilities-is-browser';\nimport { useRouter } from 'next/router';\nimport { getLanguageDirection } from '@dx-ui/utilities-get-language-direction';\nimport styles from './map.module.css';\nimport { useHotelQuadrantsQuery } from '@dx-ui/queries-dx-shop-search-ui';\n\ntype IMap = {\n  children?: React.ReactNode;\n  /**\n   * setting `initialBounds` will use the google maps api method `fitBounds()` to set the zoom and center of the map\n   */\n  initialBounds?: google.maps.LatLngBoundsLiteral;\n  /**\n   * supports all options from https://developers.google.com/maps/documentation/javascript/reference/map#MapOptions\n   */\n  options?: google.maps.MapOptions;\n  /**\n   * whenever the map is panned or zoomed, the bounds of the map are changed.\n   */\n  onBoundsChange?: (bounds: google.maps.LatLngBoundsLiteral) => void;\n  /**\n   * whenever the map is panned, the bounds of the map are changed.\n   */\n  onPan?: (bounds: google.maps.LatLngBoundsLiteral) => void;\n  /**\n   * whenever the map is zoomed, the bounds of the map are changed.\n   */\n  onZoom?: () => void;\n  /**\n   * for development, it is nice to see the bounds that are passed for the initial view\n   */\n  showInitialBounds?: boolean;\n  /**\n   * for debug, see quad node boundaries and additional debug info\n   */\n  showQuadNodeBounds?: boolean;\n};\n/**\n * This is the base for the Google Maps JavaScript API\n *\n * https://developers.google.com/maps/documentation/javascript/reference/map\n */\nexport const MapBase = ({\n  children,\n  initialBounds,\n  options,\n  onBoundsChange,\n  onPan,\n  onZoom,\n  showInitialBounds,\n  showQuadNodeBounds,\n}: IMap) => {\n  const { apiKey, setMap, setInfoWindow, setInfoWindowContainer, map } = useMap();\n  const mapRef = useRef<HTMLDivElement>(null);\n  const infoWindowRef = useRef<HTMLDivElement>(null);\n  const hasDrawnInitialBoundingBox = useRef(false);\n  const hasDrawnInitialQuadNodes = useRef(false);\n  const router = useRouter();\n  const resetMap = useRef(true); // reset map on every search 'Update' cta click\n  const isMapInitialized = useRef(false);\n\n  const { data: quadNodesData } = useHotelQuadrantsQuery(\n    {},\n    {\n      enabled: isBrowser,\n    }\n  );\n\n  useEffect(() => {\n    const listeners: google.maps.MapsEventListener[] = [];\n\n    const initMap = () => {\n      // empty the array, but keep the reference\n      listeners.length = 0;\n      const map = new google.maps.Map(mapRef.current as HTMLDivElement, {\n        clickableIcons: false,\n        disableDefaultUI: true,\n        zoomControl: true,\n        zoomControlOptions: {\n          position:\n            getLanguageDirection(router.locale) === 'rtl'\n              ? google.maps.ControlPosition.LEFT_TOP\n              : google.maps.ControlPosition.RIGHT_TOP,\n        },\n        restriction: {\n          latLngBounds: { north: 85, south: -85, west: -180, east: 180 },\n          strictBounds: true,\n        },\n        maxZoom: MAX_ZOOM,\n        ...options,\n      });\n\n      if (onBoundsChange) {\n        listeners.push(\n          map.addListener('bounds_changed', () => {\n            const bounds = map.getBounds();\n            if (bounds) {\n              onBoundsChange(bounds.toJSON());\n            }\n          })\n        );\n      }\n      if (onPan) {\n        listeners.push(\n          map.addListener('dragend', () => {\n            const bounds = map.getBounds();\n            if (bounds) {\n              onPan(bounds.toJSON());\n            }\n          })\n        );\n      }\n      if (onZoom) {\n        const handleTilesLoaded = () => {\n          if (!isMapInitialized.current) {\n            isMapInitialized.current = true;\n            listeners.push(map.addListener('zoom_changed', () => onZoom()));\n          }\n        };\n        listeners.push(map.addListener('tilesloaded', handleTilesLoaded));\n      }\n      setMap(map);\n\n      if (infoWindowRef.current) {\n        setInfoWindowContainer(infoWindowRef.current);\n        const newInfoWindow = new google.maps.InfoWindow({\n          content: infoWindowRef.current,\n          disableAutoPan: true,\n        });\n        setInfoWindow(newInfoWindow);\n      }\n    };\n\n    if (!window.google) {\n      const script = document.createElement('script');\n      script.src = `${MAPS_URL}&key=${apiKey}&language=${router.locale}`;\n      script.defer = true;\n      script.async = true;\n\n      script.onload = initMap;\n      document.body.appendChild(script);\n    } else {\n      initMap();\n    }\n\n    return () => {\n      listeners.forEach((listener) => listener.remove());\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  //if bounds changes due to shallow route re-calc bounds!\n  React.useEffect(() => {\n    if (initialBounds && map && resetMap) {\n      map.setZoom(9);\n      map.fitBounds(initialBounds);\n      resetMap.current = false;\n    }\n    router.events.on('routeChangeComplete', () => {\n      resetMap.current = true;\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [JSON.stringify(initialBounds), map, resetMap.current]);\n\n  //Show debug initial bounds bbox\n  React.useEffect(() => {\n    if (showInitialBounds && map && initialBounds && !hasDrawnInitialBoundingBox.current) {\n      new google.maps.Rectangle({ map, bounds: initialBounds, strokeWeight: 1, fillOpacity: 0.1 });\n      hasDrawnInitialBoundingBox.current = true;\n    }\n  }, [showInitialBounds, map, initialBounds]);\n\n  //Show debug of hotel quad nodes\n  React.useEffect(() => {\n    if (\n      showQuadNodeBounds &&\n      map &&\n      !hasDrawnInitialQuadNodes.current &&\n      quadNodesData?.hotelQuadrants\n    ) {\n      quadNodesData?.hotelQuadrants?.forEach((node) => {\n        //rectangle representing node\n        new google.maps.Rectangle({\n          map,\n          bounds: {\n            south: Math.max(node?.bounds?.southwest?.latitude ?? -89.99, -89.99),\n            west: Math.max(node?.bounds?.southwest?.longitude ?? -179.99, -179.99),\n            north: Math.min(node?.bounds?.northeast?.latitude ?? 89.99, 89.99),\n            east: Math.min(node?.bounds?.northeast?.longitude ?? 179.99, 179.99),\n          },\n          strokeWeight: 1,\n          fillOpacity: 0.1,\n        });\n        //debug info corresponding to node\n        new google.maps.Marker({\n          position: {\n            lat:\n              ((node?.bounds?.northeast?.latitude ?? -89.99) +\n                (node?.bounds?.southwest?.latitude ?? 89.99)) /\n              2,\n            lng:\n              ((node?.bounds?.northeast?.longitude ?? 179.99) +\n                (node?.bounds?.southwest?.longitude ?? -179.99)) /\n              2,\n          },\n          map,\n          label: {\n            className: styles.node_debug_info,\n            text: node?.id || 'no id',\n          } as string | google.maps.MarkerLabel,\n        });\n      });\n      hasDrawnInitialQuadNodes.current = true;\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [map, quadNodesData?.hotelQuadrants]);\n\n  return (\n    <>\n      <div\n        className=\"absolute left-0 m-0 size-full p-0 md:top-0\"\n        id=\"searchGoogleMaps\"\n        ref={mapRef}\n      />\n      <div data-testid=\"mapMarker\" ref={infoWindowRef} />\n      {children}\n    </>\n  );\n};\n","import type * as React from 'react';\nimport { useState } from 'react';\nimport { MapContext } from './map.context';\nimport type MarkerClusterer from '@googlemaps/markerclustererplus';\n\ntype MapProviderProps = { apiKey: string; children: React.ReactNode };\n\nconst MapProvider = ({ apiKey, children }: MapProviderProps) => {\n  const [clusterer, setClusterer] = useState<MarkerClusterer>();\n  const [infoWindow, setInfoWindow] = useState<google.maps.InfoWindow>();\n  const [infoWindowContainer, setInfoWindowContainer] = useState<HTMLDivElement>();\n  const [map, setMap] = useState<google.maps.Map>();\n\n  return (\n    <MapContext.Provider\n      value={{\n        apiKey,\n        clusterer,\n        infoWindow,\n        infoWindowContainer,\n        map,\n        setClusterer,\n        setInfoWindow,\n        setInfoWindowContainer,\n        setMap,\n      }}\n    >\n      {children}\n    </MapContext.Provider>\n  );\n};\n\nexport default MapProvider;\n","import { env } from '../../constants';\nimport { useWrappedRouter } from '../../hooks';\nimport { MapBase } from './map.base';\nimport MapProvider from './map.provider';\n\nexport const Map = ({\n  handleBoundsChange,\n  hasUserPanned,\n  hasUserZoomed,\n  initialBounds,\n  children,\n}: {\n  handleBoundsChange: (newBounds: google.maps.LatLngBoundsLiteral) => void;\n  hasUserPanned: React.MutableRefObject<boolean>;\n  hasUserZoomed: React.MutableRefObject<boolean>;\n  initialBounds: google.maps.LatLngBoundsLiteral;\n  children: React.ReactNode;\n}) => {\n  const { safeQueryParams: queryParameters } = useWrappedRouter();\n\n  return (\n    <MapProvider apiKey={env.MAP_API_KEY}>\n      <MapBase\n        initialBounds={initialBounds}\n        onBoundsChange={(bounds) => handleBoundsChange(bounds)}\n        onPan={() => {\n          // need to know if user interacted with the map\n          hasUserPanned.current = true;\n        }}\n        onZoom={() => (hasUserZoomed.current = true)}\n        showInitialBounds={queryParameters?.showBbox}\n        showQuadNodeBounds={queryParameters?.isDebugQuadTrees as boolean}\n      >\n        {children}\n      </MapBase>\n    </MapProvider>\n  );\n};\n","import { useCallback } from 'react';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { isAffiliateHotel, useMetrics, useRenovationChip, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { prefixPublicAssetUriWithAppPrefix } from '../../utils';\nimport { isLocalCurrencySameAsHotelCurrency } from '../hotel-card/utils/hotel-info-utils';\nimport MapInfoWindow from './map.info-window';\nimport MapMarker, { MAP_MARKER_COLOR } from './map.marker';\nimport MapStaticMarker from './map.static-marker';\nimport MapMarkers from './map.markers';\nimport { getMapMarkerIcon, getMarkerPrice } from './map.utils';\nimport { InfoWindow } from '@dx-ui/osc-map';\nimport type { HotelBadgeTypes } from '../hotel-card/hotel-badges';\nimport { HotelBadges } from '../hotel-card/hotel-badges';\nimport { formatAndConvertPrice, useCurrencyConversion } from '@dx-ui/osc-currency-converter';\n\nexport const LocationsMapMarkers = ({\n  centerCoordinate,\n  hotelsInBounds,\n  visibleHotels,\n}: {\n  centerCoordinate: {\n    lat: number;\n    lng: number;\n  };\n  hotelsInBounds: Record<string, HotelType>;\n  visibleHotels: string[];\n}) => {\n  const { activeProperty, selectedCurrency, selectedCtyhocn, shouldUsePoints } = useAppState();\n  const { currenciesError, currenciesMap } = useCurrencyConversion();\n  const dispatch = useAppDispatch();\n  const metrics = useMetrics();\n  const { router } = useWrappedRouter();\n  const { renoChipConfig } = useRenovationChip();\n  const disableMarkerPrice = !!(visibleHotels.length > 150);\n\n  const handleMapMarkerClicked = useCallback(\n    (ctyhocn: string, name?: string | null) => {\n      dispatch({ type: 'SET_PDP_CTYHOCN', payload: ctyhocn });\n      metrics.setBrandDetail({\n        ctyhocn,\n        view: 'Map',\n        name: name || '',\n        index: 1,\n      });\n    },\n    [dispatch, metrics]\n  );\n\n  return (\n    <MapMarkers\n      activeMarker={activeProperty || selectedCtyhocn}\n      iconClusterPath=\"/modules/assets/svgs/map/cluster/HI.svg\"\n    >\n      <MapStaticMarker\n        icon={prefixPublicAssetUriWithAppPrefix('/assets/map-pin-active.png')}\n        position={centerCoordinate}\n        shouldShowCenterMarker={true}\n      />\n      {visibleHotels.map((hotelCtyhocn) => {\n        const hotel = hotelsInBounds[hotelCtyhocn];\n        if (hotel) {\n          const {\n            ctyhocn,\n            localization,\n            brandCode: hotelBrandCode,\n            name,\n            address,\n            amenityIds,\n          } = hotel;\n\n          const badges: HotelBadgeTypes[] = [];\n          if (amenityIds.includes('newHotel')) badges.push('new');\n          if (renoChipConfig?.includes(ctyhocn)) badges.push('recentlyRenovated');\n\n          const coordinate = localization?.coordinate || null;\n          const price =\n            currenciesMap.size &&\n            !isLocalCurrencySameAsHotelCurrency(\n              selectedCurrency || '',\n              hotel?.localization?.currencyCode || ''\n            )\n              ? formatAndConvertPrice({\n                  basePrice: !hotel?.leadRate?.lowest?.rateAmount\n                    ? undefined\n                    : hotel.leadRate?.lowest?.rateAmount,\n                  currencyQueryError: !!currenciesError,\n                  fromCurrency: currenciesMap?.get('USD'),\n                  language: router.locale,\n                  toCurrency: currenciesMap.get(selectedCurrency || ''),\n                }) || hotel?.leadRate?.lowest?.rateAmountFmt\n              : hotel?.leadRate?.lowest?.rateAmountFmt;\n          const points = hotel?.leadRate?.hhonors?.lead?.dailyRmPointsRateNumFmt;\n\n          if (!coordinate) return null;\n          const position = { lat: coordinate.latitude, lng: coordinate.longitude };\n          const isActive = activeProperty === ctyhocn || selectedCtyhocn === ctyhocn;\n          const suppressBrandLogo = isAffiliateHotel(hotel?.display);\n          return (\n            <MapMarker\n              isActive={isActive}\n              color={\n                !!shouldUsePoints && !!points ? MAP_MARKER_COLOR['POINTS_EXPLORER'] : undefined\n              }\n              icon={prefixPublicAssetUriWithAppPrefix(\n                getMapMarkerIcon(isActive, disableMarkerPrice)\n              )}\n              id={ctyhocn}\n              key={`map-marker-item-${ctyhocn}`}\n              label={getMarkerPrice(disableMarkerPrice, shouldUsePoints, points, price)}\n              onClick={() => handleMapMarkerClicked(ctyhocn, name)}\n              onMouseOut={() => dispatch({ type: 'UNSET_HIGHLIGHTED_MAP_CTYHOCN' })}\n              onMouseOver={() =>\n                dispatch({ type: 'SET_HIGHLIGHTED_MAP_CTYHOCN', payload: ctyhocn })\n              }\n              position={position}\n            >\n              <MapInfoWindow\n                onCloseClick={() => dispatch({ type: 'SET_PDP_CTYHOCN', payload: null })}\n                position={position}\n              >\n                <InfoWindow\n                  address={address ? `${address.addressLine1}, ${address.city}` : ''}\n                  brandCode={suppressBrandLogo ? undefined : hotelBrandCode || 'HI'}\n                  ctyhocn={ctyhocn}\n                  hotelBadges={<HotelBadges badges={badges} />}\n                  name={name || ''}\n                  containerClassName='w-56 sm:w-fit !font-[\"Hilton-Sans\"]'\n                />\n              </MapInfoWindow>\n            </MapMarker>\n          );\n        }\n        return null;\n      })}\n    </MapMarkers>\n  );\n};\n","import { MapListToggleButton } from '../map-list-toggle-button/map-list-toggle-button';\nimport { Spinner } from '@dx-ui/osc-spinner';\nimport { ZoomInForPricing } from '../zoom-in-for-pricing';\nimport { SearchMapMarkers } from './map.markers.search';\nimport { MAX_PRICE_PROPERTY_LIMIT } from '../../constants';\nimport { Map } from './map';\nimport { useAppState } from '../../providers/app-provider';\nimport { HotelSearchResultSummaryPanel } from '../hotel-search-result-summary/hotel-search-result-summary';\nimport { useConductricsSelection } from '@dx-ui/framework-conductrics';\nimport { useTranslation } from 'next-i18next';\nimport cx from 'classnames';\nimport type { ActiveFiltersState } from '../filters/filter.constants';\nimport type { MutableRefObject, RefObject } from 'react';\nimport type { DebouncedState } from 'usehooks-ts';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { useWrappedRouter, useMapListToggle } from '../../hooks';\nimport { LocationsMapMarkers } from './map.markers.locations';\n// eslint-disable-next-line lodash/import-scope\nimport type { DebouncedFunc } from 'lodash';\nimport type { AmenityItem } from '../filters/suggested-filters';\nimport type { Maybe } from '@dx-ui/gql-types';\nimport { useConfigRule } from '@dx-ui/framework-config-rule-provider';\n\ntype MapProps = {\n  showSpinner: boolean | undefined;\n  visibleFilteredInBoundHotels: string[];\n  handleBoundsChange:\n    | DebouncedState<(newBounds: google.maps.LatLngBoundsLiteral) => void>\n    | DebouncedFunc<(newBounds: google.maps.LatLngBoundsLiteral) => void>;\n  hasUserPanned: MutableRefObject<boolean>;\n  hasUserZoomed: MutableRefObject<boolean>;\n  initialBounds:\n    | {\n        south: number;\n        west: number;\n        north: number;\n        east: number;\n      }\n    | google.maps.LatLngBoundsLiteral;\n  sortedHotels?: HotelType[];\n  filterChange: (activeFiltersState: Partial<ActiveFiltersState>) => void;\n  saleFilterCount?: number | undefined;\n  showSaleFilter?: boolean;\n  isFindingHotels: boolean;\n  h1SearchResultsContent?: string;\n  hotelCounterRef: RefObject<HTMLDivElement>;\n  pageHeading1Title?: string;\n  centerCoordinate: {\n    lat: number;\n    lng: number;\n  };\n  amenities: AmenityItem[] | undefined;\n  matchId?: Maybe<string>;\n  counterMessage?: {\n    customCounterMessage: string;\n    customCounterSRMessage: string;\n  };\n};\nexport const MapBlock = ({\n  showSpinner,\n  visibleFilteredInBoundHotels,\n  handleBoundsChange,\n  hasUserPanned,\n  hasUserZoomed,\n  initialBounds,\n  sortedHotels,\n  filterChange,\n  saleFilterCount,\n  showSaleFilter,\n  isFindingHotels,\n  h1SearchResultsContent,\n  hotelCounterRef,\n  pageHeading1Title,\n  amenities,\n  matchId,\n  centerCoordinate,\n  counterMessage,\n}: MapProps) => {\n  const { isListVisible, hotelsInBounds } = useAppState();\n  const { isSlimView, isDesktopMapView } = useMapListToggle();\n  const { t } = useTranslation('search-page');\n  const {\n    router: { asPath },\n  } = useWrappedRouter();\n  const isSearchPage = asPath.includes('/search/');\n  const { taggedConfig } = useConfigRule();\n  const shouldShowMap = isSearchPage ? !!taggedConfig?.config['showMap'] : true;\n  const { isLoaded: isConductricsLoaded } = useConductricsSelection('');\n\n  return (\n    shouldShowMap && (\n      <div\n        className={cx('z-0 h-screen text-center @container max-md:w-full', {\n          'max-md:invisible absolute md:sticky md:top-0': isListVisible,\n          'max-sm:z-1 relative': !isListVisible,\n          'relative overflow-hidden': isDesktopMapView,\n        })}\n        data-testid=\"mapContainer\"\n      >\n        {/* Map/List toggle button */}\n        {shouldShowMap && !isListVisible && (\n          <HotelSearchResultSummaryPanel\n            amenities={amenities}\n            customCounterMessage={counterMessage?.customCounterMessage}\n            customCounterSRMessage={counterMessage?.customCounterSRMessage}\n            hotelCount={sortedHotels?.length ?? 0}\n            isFindingHotels={isFindingHotels}\n            isConductricsLoaded={isConductricsLoaded}\n            matchId={matchId}\n            onFilterChange={(activeFiltersState: ActiveFiltersState) =>\n              filterChange(activeFiltersState)\n            }\n            pageHeading1Title={\n              pageHeading1Title ??\n              t('searchResults', {\n                name: h1SearchResultsContent,\n              })\n            }\n            saleFilter={{\n              showSaleFilter: !!showSaleFilter,\n              saleFilterCount: saleFilterCount ?? 0,\n            }}\n            visibleHotels={visibleFilteredInBoundHotels}\n            showingHotelDivRef={hotelCounterRef}\n          />\n        )}\n        <div className={cx('relative h-full overflow-hidden')}>\n          <div className=\"absolute top-3 z-20 ltr:left-3 rtl:right-3\">\n            <MapListToggleButton showMapListToggleButton={!isSlimView} />\n          </div>\n\n          {showSpinner && (\n            <div\n              className={cx('absolute z-1 ml-4 mt-4 bg-bg p-2 rtl:mr-4', {\n                'top-12': !isSlimView,\n              })}\n            >\n              <Spinner className=\"text-hilton-alt\" size=\"lg\" />\n            </div>\n          )}\n          {/* Show zoom in overlay on map if we have > 150 hotels on map */}\n          {visibleFilteredInBoundHotels.length > MAX_PRICE_PROPERTY_LIMIT ? (\n            <div className=\"flex justify-center\">\n              <ZoomInForPricing />\n            </div>\n          ) : null}\n          <Map\n            handleBoundsChange={handleBoundsChange}\n            hasUserPanned={hasUserPanned}\n            hasUserZoomed={hasUserZoomed}\n            initialBounds={initialBounds}\n          >\n            {isSearchPage && sortedHotels ? (\n              <SearchMapMarkers\n                centerCoordinate={centerCoordinate}\n                matchId={matchId}\n                sortedHotels={sortedHotels}\n              />\n            ) : (\n              <LocationsMapMarkers\n                centerCoordinate={centerCoordinate}\n                hotelsInBounds={hotelsInBounds}\n                visibleHotels={visibleFilteredInBoundHotels}\n              />\n            )}\n          </Map>\n        </div>\n      </div>\n    )\n  );\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"node_debug_info\":\"map_node_debug_info___9ET3\"};","import { useTranslation } from 'next-i18next';\nimport { VERTICAL_SPACE_SAVINGS } from '../constants';\nimport { useGetMVTSelections } from './use-get-mvt-selections';\n\nexport const useVerticalSpaceMVT = () => {\n  const { t } = useTranslation('filters');\n  const {\n    isLoaded: isVerticalSpaceMVTLoaded,\n    isMVTVariant: {\n      b: isVerticalSpaceVar1,\n      c: isVerticalSpaceVar2,\n      d: isVerticalSpaceVar3,\n      e: isVerticalSpaceVar4,\n      f: isVerticalSpaceVar5,\n      g: isVerticalSpaceVar6,\n      h: isVerticalSpaceVar7,\n      i: isVerticalSpaceVar8,\n    },\n  } = useGetMVTSelections({\n    agentId: VERTICAL_SPACE_SAVINGS.agentId,\n    MVTVariants: ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'],\n  });\n  const filterAndSortLabel = t('filterAndSort');\n  const isFilterAndSortInAccordion =\n    isVerticalSpaceVar1 || isVerticalSpaceVar5 || isVerticalSpaceVar6;\n  const isSuggestedFiltersInHorizontalScroll =\n    isVerticalSpaceVar4 || isVerticalSpaceVar6 || isVerticalSpaceVar8;\n  const isShorterSuggestedFilters =\n    isVerticalSpaceVar3 || isVerticalSpaceVar5 || isVerticalSpaceVar7;\n  const isCurrencyAndSortInAllFiltersModal =\n    isVerticalSpaceVar2 || isVerticalSpaceVar7 || isVerticalSpaceVar8;\n\n  return isVerticalSpaceMVTLoaded\n    ? {\n        filterAndSortLabel,\n        isFilterAndSortInAccordion,\n        isShorterSuggestedFilters,\n        isCurrencyAndSortInAllFiltersModal,\n        isSuggestedFiltersInHorizontalScroll,\n        isVerticalSpaceVar8,\n      }\n    : {};\n};\n","import { useAuth } from '@dx-ui/framework-auth-provider';\nimport { useWrappedRouter } from '../../../hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useEffect, useRef } from 'react';\nimport cx from 'classnames';\n\nexport const PointsMessage = ({ className }: { className?: string }) => {\n  const { guestInfo } = useAuth();\n  const { t } = useTranslation('use-points');\n  const { router } = useWrappedRouter();\n  const pointsAvailable = guestInfo?.hhonors?.summary?.points;\n  const ref = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (ref?.current && router.query?.['pointsLogin']) return ref.current.focus();\n  }, [router.query]);\n\n  return (\n    <div className={cx('text-sm font-bold text-tier-diamond', className)} ref={ref} tabIndex={-1}>\n      <span className=\"sr-only\" aria-live=\"assertive\">\n        {t('numPoints_a11y', { numPoints: pointsAvailable })}\n      </span>\n      <span aria-hidden=\"true\" className=\"text-nowrap\">\n        {t('numPoints', { numPoints: pointsAvailable })}\n      </span>\n    </div>\n  );\n};\n","import { useState, useEffect } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport { MAX_PROPERTIES_PER_LIST_VIEW_PAGE } from '../../constants';\n\nexport type HotelCounterProps = {\n  count: number;\n  currentPageIndex: number;\n  customMessage?: string;\n  customSRMessage?: string;\n  isLoading: boolean;\n  isListVisible: boolean;\n};\n\nexport const HotelCounter = ({\n  count,\n  currentPageIndex,\n  isLoading,\n  customMessage,\n  customSRMessage,\n  isListVisible,\n}: HotelCounterProps) => {\n  const pageStart = currentPageIndex * MAX_PROPERTIES_PER_LIST_VIEW_PAGE + 1;\n  const pageEnd =\n    pageStart + MAX_PROPERTIES_PER_LIST_VIEW_PAGE - 1 < count\n      ? pageStart + MAX_PROPERTIES_PER_LIST_VIEW_PAGE - 1\n      : count;\n  const { t } = useTranslation('hotel-counter-text');\n\n  const message = customMessage\n    ? customMessage\n    : count > MAX_PROPERTIES_PER_LIST_VIEW_PAGE && isListVisible\n    ? t('hotelShowingWithPages', { count, pageStart, pageEnd })\n    : t('hotelShowingWithCount', { count });\n\n  const srMessage = customSRMessage\n    ? customSRMessage\n    : count === 0\n    ? t('notFoundMessage')\n    : message;\n  const [srCounter, setSrCounter] = useState(1);\n  useEffect(() => {\n    let interval: ReturnType<typeof setInterval>;\n    if (isLoading) {\n      interval = setInterval(() => setSrCounter(srCounter + 1), 3000);\n    } else {\n      setSrCounter(0);\n    }\n    return () => clearInterval(interval);\n  }, [isLoading, srCounter]);\n\n  return isLoading ? (\n    <div>\n      <h2\n        aria-hidden\n        className=\"text-sm font-semibold md:text-lg lg:text-xl\"\n        data-testid=\"findingHotels\"\n      >\n        {t('findingHotels')}\n      </h2>\n      <span aria-live=\"assertive\" className=\"sr-only\">\n        <span key={srCounter} role=\"status\">\n          {t('findingHotels')}\n        </span>\n      </span>\n    </div>\n  ) : (\n    <div>\n      <h2\n        className=\"mr-2 font-semibold md:mr-0 md:text-lg lg:text-xl \"\n        data-testid=\"numberOfHotelsShowing\"\n      >\n        <span aria-hidden=\"true\">{message} </span>\n      </h2>\n      <span aria-atomic=\"true\" aria-live=\"assertive\" className=\"sr-only -order-1\">\n        <span role=\"status\">{srMessage}</span>\n      </span>\n    </div>\n  );\n};\n","export * from './hotel-counter';\n","import { type LoginResponse, useAuth } from '@dx-ui/framework-auth-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { Dialog } from '@dx-ui/osc-dialog-v2';\nimport { LoginIFrame } from '@dx-ui/osc-login';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { useCallback, useState } from 'react';\nimport { useIsClient } from 'usehooks-ts';\nimport { GOALS, env } from '../../../constants';\nimport { useWrappedRouter } from '../../../hooks';\nimport { generateSigninUrl } from '../../../utils';\nimport { InfoMessageBanner } from '../../info-message-banner/info-message-banner';\n\nexport const LogInBanner = () => {\n  const isClient = useIsClient();\n  const { t } = useTranslation('list-view');\n  const { router } = useWrappedRouter();\n  const { login, isAuthenticated } = useAuth();\n  const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n\n  const closeLoginModal = () => setShowLoginModal(false);\n  const openLoginModal = () => {\n    setShowLoginModal(true);\n    sendReward(GOALS.shopLoginClick);\n  };\n\n  const lang = router.locale as string;\n  const forgetInfoUrl = env.PARTNER_FORGET_INFO_LINK.replace('/__LANG__/', `/${lang}/`);\n  const options = {\n    showCreatePassword: false,\n    forgetInfoLink: { url: forgetInfoUrl },\n    secureInfoLink: { url: env.GLOBAL_PRIVACY_URL },\n    signInLink: { url: generateSigninUrl(router.asPath, lang) },\n  };\n\n  const onSignInAttempt = useCallback(\n    async (resp: LoginResponse) => {\n      if (resp?.data) {\n        await login(resp);\n        window.location.reload();\n      }\n    },\n    [login]\n  );\n  const handleLogin = async (resp: LoginResponse) => {\n    await onSignInAttempt?.(resp);\n    if (!resp.error) {\n      closeLoginModal();\n      sendReward(GOALS.shopHonorsLogin);\n    }\n  };\n\n  return isClient && !isAuthenticated ? (\n    <>\n      <InfoMessageBanner\n        bannerClassName=\"bg-tertiary\"\n        iconClassName=\"text-bg\"\n        iconName=\"star-burst\"\n      >\n        <div className=\"pl-2.5 pt-px font-bold text-bg\">\n          <Trans\n            ns=\"list-view\"\n            i18nKey=\"loginBanner.getExclusiveRates\"\n            components={{\n              SignInLink: (\n                <button onClick={openLoginModal} type=\"button\" className=\"font-normal underline\">\n                  signing in\n                </button>\n              ),\n            }}\n          />\n        </div>\n      </InfoMessageBanner>\n      <Dialog\n        isOpen={showLoginModal}\n        onDismiss={closeLoginModal}\n        size=\"md\"\n        title={t('loginBanner.signIn')}\n      >\n        <LoginIFrame\n          data-testid=\"loginIframe\"\n          frameSrc={generateSigninUrl(router?.asPath, lang)}\n          options={options}\n          onLoginAttempt={handleLogin}\n          onClose={closeLoginModal}\n          title={t('loginBanner.signIn')}\n        />\n      </Dialog>\n    </>\n  ) : null;\n};\n","// The <abbr> tags announces the Abbreviation of states on the screen readers\n// This function will return the non-abbrevated form from the end of the Title\n// e.g. \"Hotels in New York, [NY](New York)\" becomes \"New York\"\nexport const getTitleExpandedAbbreviation = (title: string) => {\n  if (title) return title.substring(title.indexOf('(') + 1, title.lastIndexOf(')'));\n};\n","import Markdown from 'markdown-to-jsx';\nimport * as React from 'react';\nimport { getTitleExpandedAbbreviation } from './locations-page.utils';\n\n// We're \"hijacking\" markdown's link syntax in order to create <abbr> tags\n// markdown-to-jsx doesn't handle spaces in the link's href, so we need to intercept the markdown and encode the href value\n// e.g. \"Hotels in New York, [NY](New York)\" becomes \"Hotels in New York, [NY](New%20York)\"\nconst sanitizeTitleMarkdown = (title: string) =>\n  title?.replace(\n    /\\[([^\\]]+)\\]\\(([^)]+)\\)/,\n    (_, abbreviation, expandedName) => `[${abbreviation}](${encodeURI(expandedName)})`\n  );\nexport const LocationsPageHeadingLevel1 = ({ title }: { title: string | null | undefined }) => {\n  const titleAbbreviationExpanded = title ? getTitleExpandedAbbreviation(title) : undefined;\n\n  return title ? (\n    <div className=\"mb-4 flex-1 text-left rtl:text-right\">\n      <h1 className=\"font-sans text-xl font-bold\">\n        <Markdown\n          options={{\n            createElement(type, props, children) {\n              if (type === 'a') {\n                const abbreviation = children;\n                const expandedName = decodeURI((props as { href: string }).href);\n                return React.createElement(\n                  'abbr',\n                  {\n                    title: expandedName,\n                    style: { textDecoration: 'none' },\n                    key: `abbr-${JSON.stringify(children)}`,\n                    'aria-hidden': true,\n                  },\n                  abbreviation\n                );\n              }\n              return React.createElement(type, props, children);\n            },\n          }}\n        >\n          {sanitizeTitleMarkdown(title || '')}\n        </Markdown>\n      </h1>\n      {titleAbbreviationExpanded && <span className=\"sr-only\">{titleAbbreviationExpanded}</span>}\n    </div>\n  ) : null;\n};\n","import type { AmenityItem } from '../filters/suggested-filters';\nimport { SuggestedFilterButtons } from '../filters/suggested-filters';\nimport { HotelCounter } from '../hotel-counter';\nimport { MapListToggleButton } from '../map-list-toggle-button/map-list-toggle-button';\nimport { useConfigRule } from '@dx-ui/framework-config-rule-provider';\nimport type { ActiveFiltersState } from '../filters/filter.constants';\nimport type { Maybe } from '@dx-ui/gql-types';\nimport { useAppState } from '../../providers/app-provider';\nimport { SMBProfileSwitcher } from '@dx-ui/osc-smb-profile-switcher';\nimport { useSmbToggle, useWrappedRouter } from '../../hooks';\nimport { LogInBanner } from '../list-view/log-in-banner/log-in-banner';\nimport { LocationsPageHeadingLevel1 } from '../locations-page/locations-page-heading';\nimport { useVerticalSpaceMVT } from '../../hooks/use-vertical-space-MVT';\n\nexport const HotelSearchResultSummaryPanel = ({\n  amenities,\n  customCounterMessage,\n  customCounterSRMessage,\n  hotelCount,\n  isFindingHotels,\n  isConductricsLoaded,\n  matchId,\n  onFilterChange,\n  saleFilter,\n  visibleHotels,\n  pageHeading1Title,\n  showingHotelDivRef,\n}: {\n  amenities?: AmenityItem[];\n  customCounterMessage?: string;\n  customCounterSRMessage?: string;\n  hotelCount: number;\n  isFindingHotels: boolean;\n  isConductricsLoaded: boolean;\n  matchId?: Maybe<string>;\n  onFilterChange?: (activeFiltersState: ActiveFiltersState) => void;\n  saleFilter?: { showSaleFilter: boolean; saleFilterCount: number };\n  visibleHotels: string[];\n  pageHeading1Title: string;\n  showingHotelDivRef?: React.Ref<HTMLDivElement>;\n}) => {\n  const { taggedConfig } = useConfigRule();\n  const configShowMap = taggedConfig?.config['showMap'] as boolean;\n  const { isListVisible, paginationIndex } = useAppState();\n  const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n  const { handleSMBSwitch, isSMBContextSwitchingEnabled } = useSmbToggle();\n  const smbChecked = queryParameters?.smbRate || false;\n\n  /* NHCSEARCH-5451 Vertical Space MVT */\n  const { isSuggestedFiltersInHorizontalScroll } = useVerticalSpaceMVT();\n\n  return (\n    <>\n      <div className=\"flex items-start justify-between\">\n        {router.asPath.includes('/locations/') ? (\n          <LocationsPageHeadingLevel1 title={pageHeading1Title} />\n        ) : (\n          <h1 className=\"mb-4 font-sans text-xl font-bold\">{pageHeading1Title}</h1>\n        )}\n        <MapListToggleButton showMapListToggleButton={configShowMap} className=\"md:hidden\" />\n      </div>\n      {isSMBContextSwitchingEnabled ? (\n        <SMBProfileSwitcher\n          className=\"mb-4\"\n          onInputChange={handleSMBSwitch}\n          isSmbChecked={smbChecked}\n        />\n      ) : null}\n      {isSuggestedFiltersInHorizontalScroll ? null : (\n        <SuggestedFilterButtons\n          amenities={amenities}\n          isConductricsLoaded={isConductricsLoaded}\n          isFindingHotels={isFindingHotels}\n          onFilterCriteriaChange={(activeFiltersState: ActiveFiltersState) => {\n            if (onFilterChange) onFilterChange(activeFiltersState);\n          }}\n          visibleHotels={visibleHotels}\n          matchId={matchId}\n          saleFilter={saleFilter}\n        />\n      )}\n      <LogInBanner />\n      <div\n        ref={showingHotelDivRef}\n        tabIndex={-1}\n        className=\"flex items-center justify-between pb-2\"\n      >\n        <HotelCounter\n          count={hotelCount}\n          customMessage={customCounterMessage}\n          customSRMessage={customCounterSRMessage}\n          currentPageIndex={paginationIndex}\n          isListVisible={isListVisible}\n          isLoading={isFindingHotels}\n        />\n      </div>\n    </>\n  );\n};\n","import type { TFunction } from 'i18next';\nimport type {\n  HotelImageRatioName,\n  HotelImageVariantSize,\n  HotelQuery,\n  Maybe,\n} from '@dx-ui/queries-dx-shop-search-ui';\nimport { getAspectRatioUrl } from '@dx-ui/utilities-images';\nimport { getNoPhotoAvailable } from '../../utils';\nimport type { IconNames } from '@dx-ui/osc-icon';\n\nexport const MOBILE_COMPARE_LIMIT = 2;\nexport const TABLET_COMPARE_LIMIT = 3;\nexport const DESKTOP_COMPARE_LIMIT = 5;\n\nexport const getParkingType = (\n  parking: NonNullable<HotelQuery['hotel']>['parking'] | null | undefined,\n  t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page', 'compare-hotels'], undefined>\n) => {\n  switch (true) {\n    case parking?.hasFreeParking:\n      return t('compare-hotels:freeParking');\n    case parking?.hasValetParking:\n      return t('compare-hotels:valetParking', {\n        price: parking?.valetParkingCharge?.chargeAmountFmt,\n      });\n    case parking?.hasSelfParking && !!parking?.selfParkingCharge?.chargeAmountFmt:\n      return t('compare-hotels:selfParking', {\n        price: parking?.selfParkingCharge?.chargeAmountFmt,\n      });\n    default:\n      return t('compare-hotels:noParking');\n  }\n};\n\nexport const getRoomTypes = (\n  rooms: NonNullable<HotelQuery['hotel']>['roomTypes'] | null | undefined,\n  t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page', 'compare-hotels'], undefined>\n) => {\n  const types = new Set<string>();\n  rooms?.forEach((room) => {\n    if (room.suite) types.add(t('compare-hotels:suites'));\n    else if (room.features.some((feature) => feature.name === 'Connecting rooms'))\n      types.add(t('compare-hotels:connectedRooms'));\n    else if (room?.numBeds)\n      types.add(\n        t('compare-hotels:bedWithCount', {\n          count: room.numBeds,\n        })\n      );\n  });\n  const roomTypes: { type: string; icon: (typeof IconNames)[number] }[] = [];\n  types?.forEach((type) => {\n    if (type === t('compare-hotels:suites')) roomTypes.push({ type, icon: 'suites' });\n    else if (type === t('compare-hotels:connectedRooms'))\n      roomTypes.push({ type: t('compare-hotels:connectedRooms'), icon: 'connecting-rooms' });\n    else\n      roomTypes.push({\n        type,\n        icon: 'bed',\n      });\n  });\n  return roomTypes.sort((a, b) => a.type.localeCompare(b.type));\n};\nexport const getModalSize = ({\n  isMobile,\n  isDesktop,\n  compareCtyhocnsCount,\n}: {\n  isMobile: boolean;\n  isDesktop: boolean;\n  compareCtyhocns?: string[];\n  compareCtyhocnsCount: number;\n}) => {\n  switch (true) {\n    case isMobile:\n      return 'lg';\n    case isDesktop && compareCtyhocnsCount < 3:\n      return '2xl';\n    case isDesktop && compareCtyhocnsCount >= 4:\n      return 'container';\n    case isDesktop && compareCtyhocnsCount < 4:\n      return '5xl';\n    default:\n      return 'xl';\n  }\n};\n\ntype CompareImage = {\n  altText?: Maybe<string>;\n  ratios: Array<{ url?: Maybe<string>; size: HotelImageRatioName }>;\n  variants: Array<{ size: HotelImageVariantSize; url?: Maybe<string> }>;\n};\nexport const getCompareImage = (image?: CompareImage | null) => {\n  if (!!image?.ratios?.[0]) {\n    const { imgUrl } = getAspectRatioUrl({\n      src: image?.ratios?.[0]?.url,\n      width: 326,\n    });\n    return { url: imgUrl, altText: image?.altText };\n  }\n  const noPhoto = getNoPhotoAvailable('xs')?.[0]?.variants[0];\n  return { url: noPhoto?.url };\n};\n","import { keepPreviousData, useQueries } from '@tanstack/react-query';\nimport { HotelDocument } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { HotelQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { getMPAHotelRate } from '../../hotel-card/utils/hotel-mpa-rate-utils';\nimport {\n  getHotelLeadRateInfo,\n  type HotelCardData,\n} from '../../hotel-card/utils/hotel-lead-rate-utils';\nimport { useAppState } from '../../../providers/app-provider';\nimport { useRenovationChip, useWrappedRouter } from '../../../hooks';\nimport { useCurrencyConversion } from '@dx-ui/osc-currency-converter';\nimport useShopMultiPropAvail from '../../../hooks/use-shop-multi-prop-avail/use-shop-multi-prop-avail';\nimport { useTranslation } from 'next-i18next';\nimport type { HotelBadgeTypes } from '../../hotel-card/hotel-badges';\nimport { getDistanceFromCenterFmt, type GoogleCoordinate } from '../../../utils';\nimport { getCompareImage, getParkingType, getRoomTypes } from '../compare-hotel-utils';\nimport type { HotelInfoAttributes } from '../../hotel-card/utils/hotel-info-utils';\nimport { isIndividualRoomLimitExceeded } from '../../hotel-card/utils/hotel-info-utils';\n\nexport const useGetCompareHotelsInfo = ({\n  ctyhocns,\n  centerCoordinate,\n  displayHotelCount = 0,\n  isEnabled,\n}: {\n  ctyhocns: string[];\n  centerCoordinate: GoogleCoordinate | null;\n  displayHotelCount?: number;\n  isEnabled?: boolean;\n}) => {\n  const {\n    hasConnectingRooms,\n    selectedCurrency = '',\n    shouldUsePoints = false,\n    pageType,\n    hasSpecialRate,\n  } = useAppState();\n  const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n  const isDateFlex = queryParameters?.datesFlex || false;\n  const { currenciesError, currenciesMap } = useCurrencyConversion();\n  const { t } = useTranslation(['hotel-card', 'rate-name-cta', 'locations-page', 'compare-hotels']);\n  const { isPointsExplorer, isDateSearch, isDreams } = pageType;\n  const numOfChildren =\n    queryParameters?.rooms\n      .map((room) => room.children)\n      .reduce((previous: number, current: number) => previous + current) || 0;\n\n  const hotelsQueryArr = ctyhocns.map((ctyhocn) => {\n    const variables = { language: 'en', ctyhocn, ratios: 'threeByTwo' };\n    return {\n      queryKey: [HotelDocument, variables],\n      placeholderData: keepPreviousData,\n      retry: 2,\n      staleTime: 1000 * 60 * 10,\n      enabled: isEnabled,\n    };\n  });\n  const results = useQueries({\n    queries: hotelsQueryArr,\n  });\n  const hotelData = results.map((hotel) => hotel.data as HotelQuery);\n  const { renoChipConfig } = useRenovationChip();\n\n  const { hashedData: priceInfoCollection, isLoading: isMPALoading } = useShopMultiPropAvail({\n    ctyhocns: ctyhocns.map((ctyhocn) => ctyhocn),\n    mpaConstraints: true,\n    enabled: router.asPath.includes('/search/'),\n  });\n  const hotelInfo = hotelData.map((hotelData) => {\n    const hotel = hotelData?.hotel;\n    const isRenoHotel = renoChipConfig.includes(hotel?.ctyhocn);\n    const currentHotelPriceInfo = hotel?.ctyhocn ? priceInfoCollection[hotel.ctyhocn] : undefined;\n    const isIndividualRoomsOnly = isIndividualRoomLimitExceeded(\n      currentHotelPriceInfo?.statusCode,\n      queryParameters\n    );\n    let hotelRateInfo: HotelInfoAttributes = {};\n    if ((!!priceInfoCollection && isDateSearch) || isPointsExplorer || isDateFlex) {\n      hotelRateInfo = getMPAHotelRate({\n        numOfChildren,\n        usePoints: shouldUsePoints,\n        isDateFlex,\n        hasSpecialRate,\n        hotelData: hotel as HotelCardData,\n        priceInfo: currentHotelPriceInfo,\n        t,\n        locale: router.locale ?? 'en',\n        pageType,\n        ctyhocn: hotel?.ctyhocn,\n        queryParameters,\n        selectedCurrency,\n        hasConnectingRooms,\n        isPointsExplorer,\n        currenciesError,\n        currenciesMap,\n        isIndividualRoomsOnly,\n      });\n    } else if (isDreams) {\n      hotelRateInfo = getHotelLeadRateInfo({\n        hotelData: hotel as HotelCardData,\n        locale: router.locale ?? 'en',\n        ctyhocn: hotel?.ctyhocn,\n        usePoints: shouldUsePoints,\n        selectedCurrency,\n        hasConnectingRooms,\n        currenciesError,\n        currenciesMap,\n        pageType,\n        t,\n        queryParameters,\n      });\n    }\n\n    const badges: HotelBadgeTypes[] = [];\n    if (hotelRateInfo.isNewHotel) badges.push('new');\n    if (hotelRateInfo.isSaleHotel) badges.push('sale');\n    if (isRenoHotel) badges.push('recentlyRenovated');\n\n    const { distanceFmt: distance } = getDistanceFromCenterFmt(\n      t,\n      centerCoordinate,\n      hotel?.localization?.coordinate,\n      router.locale\n    );\n    const {\n      ctyhocn,\n      images,\n      name,\n      tripAdvisorLocationSummary,\n      parking,\n      amenities: hotelAmenities,\n      roomTypes,\n    } = hotelData?.hotel ?? {};\n    const parkingType = getParkingType(parking, t);\n    const rooms = getRoomTypes(roomTypes, t).slice(0, 3);\n    const masterImage = getCompareImage(images?.carousel?.[0]);\n    const { ctaHref, ctaLabel, messages } = hotelRateInfo ?? {};\n    const amenities = hotelAmenities\n      ?.filter((amenity) => !amenity.name.includes('parking'))\n      ?.slice(0, 4);\n\n    return {\n      ctyhocn,\n      name,\n      tripAdvisorLocationSummary,\n      amenities,\n      rooms,\n      badges,\n      distance,\n      parkingType,\n      masterImage,\n      ctaHref,\n      ctaLabel,\n      messages,\n    };\n  });\n  return {\n    isFetching: results.some((result) => result.isFetching),\n    isMPALoading,\n    hotelInfo: hotelInfo?.slice(0, displayHotelCount),\n  };\n};\n","export const CompareSkeleton = ({ numHotels }: { numHotels: number }) => (\n  <div className=\"flex w-full\">\n    {Array.from({ length: numHotels })\n      .fill('_')\n      .map((_, i) => (\n        <div\n          className=\"grid size-full min-w-40 max-w-[336px] items-start border border-border\"\n          // eslint-disable-next-line react/no-array-index-key\n          key={`compare-skeleton-${i}`}\n        >\n          {/* image */}\n          <div className=\"h-48 w-full animate-pulse border-b border-border bg-bg-alt\" />\n          {/* title */}\n          <div className=\"w-full self-start border-b border-border p-2\">\n            <div className=\"h-6 animate-pulse  bg-bg-alt\" />\n          </div>\n          {/* trip advisor */}\n          <div className=\"flex w-full flex-col justify-start gap-1 border-b border-border p-2\">\n            <div className=\" h-3 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-28 animate-pulse bg-bg-alt\" />\n            <div className=\" h-3 w-32 animate-pulse bg-bg-alt\" />\n          </div>\n          {/* pricing */}\n          <div className=\"flex w-full flex-col justify-start gap-1 border-b border-border p-2\">\n            <div className=\" h-12 w-24 animate-pulse bg-bg-alt\" />\n            <div className=\" h-4 w-32 animate-pulse bg-bg-alt\" />\n          </div>\n          {/* parking */}\n          <div className=\"flex w-full flex-col gap-1 self-start border-b border-border p-2\">\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n          </div>\n          {/* amenities */}\n          <div className=\"flex w-full flex-col gap-1 self-start border-b border-border p-2\">\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n          </div>\n          {/* rooms */}\n          <div className=\"flex w-full flex-col gap-1 self-start border-b border-border p-2\">\n            <div className=\" h-4 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n            <div className=\" h-6 w-32 animate-pulse bg-bg-alt\" />\n          </div>\n          {/* CTA */}\n          <div className=\"flex w-full flex-col items-center gap-1 p-2\">\n            <div className=\" h-10 w-full animate-pulse bg-bg-alt\" />\n            {numHotels > 2 ? <div className=\" h-6 w-1/2 animate-pulse bg-bg-alt\" /> : null}\n          </div>\n        </div>\n      ))}\n  </div>\n);\n","import { Dialog } from '@dx-ui/osc-dialog-v2';\nimport { useTranslation } from 'next-i18next';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { useWrappedRouter } from '../../hooks';\nimport { getModalSize, MOBILE_COMPARE_LIMIT, TABLET_COMPARE_LIMIT } from './compare-hotel-utils';\n\nimport { useGetCompareHotelsInfo } from './hooks/use-get-compare-hotels';\nimport Image from 'next/image';\nimport { CompareSkeleton } from './compare-skeleton';\nimport { TripAdvisorRating } from '../trip-advisor/trip-advisor-rating';\nimport Icon from '@dx-ui/osc-icon';\nimport { RateInfoMessages } from '../rate-name-cta/rate-name-cta';\nimport { Link } from '@dx-ui/osc-link';\nimport { HotelBadges } from '../hotel-card/hotel-badges';\nimport type { GoogleCoordinate } from '../../utils';\nimport { useAppDispatch } from '../../providers/app-provider';\n\ntype CompareModalProps = {\n  centerCoordinate: GoogleCoordinate | null;\n  hotelsToCompare: string[];\n  isOpen: boolean;\n  onDismiss: () => void;\n  onStopCompare?: () => void;\n};\nexport const CompareModal = ({\n  hotelsToCompare,\n  isOpen,\n  onDismiss,\n  onStopCompare,\n  centerCoordinate,\n}: CompareModalProps) => {\n  const { t } = useTranslation('compare-hotels');\n  const {\n    router: { asPath },\n  } = useWrappedRouter();\n  const isDesktop = useMediaQuery('(min-width:1024px)');\n  const isMobile = useMediaQuery('(max-width:640px)');\n  const isTablet = useMediaQuery(`(max-width:1023px)`);\n\n  const dispatch = useAppDispatch();\n\n  const showRemoveCTA = hotelsToCompare.length > 2;\n\n  const modalSize = getModalSize({\n    isMobile,\n    isDesktop: isTablet || isDesktop,\n    compareCtyhocnsCount: hotelsToCompare?.length || 0,\n  });\n\n  const onRemoveHotel = (ctyhocnToRemove?: string) => {\n    if (ctyhocnToRemove) {\n      const newCtyhocnList = hotelsToCompare?.filter((hotel) => hotel !== ctyhocnToRemove);\n      dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: newCtyhocnList });\n    }\n  };\n  let displayHotelCount = hotelsToCompare?.length;\n\n  if (isMobile) displayHotelCount = MOBILE_COMPARE_LIMIT;\n  else if (isTablet)\n    displayHotelCount =\n      hotelsToCompare.length > TABLET_COMPARE_LIMIT ? TABLET_COMPARE_LIMIT : hotelsToCompare.length;\n\n  const { hotelInfo, isMPALoading, isFetching } = useGetCompareHotelsInfo({\n    ctyhocns: hotelsToCompare,\n    centerCoordinate,\n    displayHotelCount,\n    isEnabled: isOpen,\n  });\n\n  const handleOnDismiss = (\n    event: React.MouseEvent | React.KeyboardEvent,\n    isStopCompare?: boolean\n  ) => {\n    if (!!isStopCompare) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n    onDismiss();\n  };\n\n  const handleStopComparing = (event: React.MouseEvent | React.KeyboardEvent) => {\n    if (hotelsToCompare.length) dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: [] });\n    if (onStopCompare) setTimeout(() => onStopCompare(), 50);\n    handleOnDismiss(event, true);\n  };\n\n  const stopComparingButton = () => (\n    <div className=\"sticky -bottom-4 flex h-full items-center justify-center bg-bg py-2\">\n      <button\n        className=\"btn-primary-link mt-2.5 text-sm\"\n        type=\"button\"\n        onClick={handleStopComparing}\n      >\n        {t('stopComparing')}\n      </button>\n    </div>\n  );\n\n  return (\n    <Dialog\n      bottomContent={stopComparingButton()}\n      isOpen={isOpen}\n      size={modalSize}\n      title={t('compare')}\n      onDismiss={handleOnDismiss as () => void}\n      dialogClassName=\"max-h-[90vh]\"\n      stickyHeader\n    >\n      {isFetching || isMPALoading ? (\n        <CompareSkeleton numHotels={hotelsToCompare.length} />\n      ) : (\n        <div className=\"flex flex-col overflow-auto\">\n          <table className=\"border border-border-alt\">\n            <tr>\n              {hotelInfo.map((data) => {\n                return (\n                  <td\n                    className=\"h-full border-2 border-border-alt p-0\"\n                    key={`${data?.ctyhocn}-image`}\n                  >\n                    <Image\n                      alt={data?.masterImage?.altText ?? ''}\n                      width={600}\n                      height={400}\n                      src={data?.masterImage?.url ?? ''}\n                      unoptimized={true}\n                      data-testid=\"carousel-image\"\n                    />\n                  </td>\n                );\n              })}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => {\n                return (\n                  <th\n                    className=\"border-2  border-border p-2 text-left align-top text-sm font-bold\"\n                    key={data?.name}\n                    scope=\"col\"\n                  >\n                    {data?.name}\n\n                    {data?.badges ? <HotelBadges badges={data?.badges} /> : null}\n                    <span\n                      className=\"block whitespace-nowrap text-xs font-normal text-text-alt\"\n                      data-testid=\"distanceMarker\"\n                    >\n                      {data?.distance}\n                    </span>\n                  </th>\n                );\n              })}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => {\n                const tripAdvisorLocationSummary = data?.tripAdvisorLocationSummary;\n                return (\n                  <td\n                    className=\"border-2 border-border p-2\"\n                    key={tripAdvisorLocationSummary?.numReviews}\n                  >\n                    <TripAdvisorRating\n                      tripAdvisorLocationSummary={tripAdvisorLocationSummary}\n                      showReviewCount\n                      isCompare\n                    />\n                  </td>\n                );\n              })}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => {\n                return (\n                  <td className=\"border-2 border-border p-2\" key={`${data?.ctyhocn}-rate`}>\n                    <RateInfoMessages rateMessages={data?.messages} isCompare />\n                  </td>\n                );\n              })}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => {\n                return (\n                  <td\n                    className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n                    key={`${data?.ctyhocn}-parking`}\n                  >\n                    <div className=\"flex items-start sm:items-center\">\n                      <Icon name=\"parking\" />\n                      <span>{data?.parkingType}</span>\n                    </div>\n                  </td>\n                );\n              })}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => {\n                return (\n                  <td\n                    className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n                    key={`${data?.ctyhocn}-amenities`}\n                  >\n                    <ul className=\"grid grid-cols-1 text-sm\">\n                      {data?.amenities?.map((amenity) => (\n                        <li key={amenity.id} className=\"flex items-center gap-0.5\">\n                          <Icon name=\"check\" />\n                          <span> {amenity.name}</span>\n                        </li>\n                      ))}\n                    </ul>\n                  </td>\n                );\n              })}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => (\n                <td\n                  className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n                  key={`${data?.ctyhocn}-rooms`}\n                >\n                  <ul className=\"grid grid-cols-1 gap-1.5 text-sm font-bold\">\n                    <p>\n                      {t(\n                        asPath.includes('/locations/') ? 'roomTypesOffered' : 'roomTypesAvailable'\n                      )}\n                    </p>\n                    {data?.rooms?.map((room) => (\n                      <li\n                        key={room?.type}\n                        className=\"flex items-start gap-0.5 font-normal sm:items-center\"\n                      >\n                        <Icon name={room.icon} />\n                        <span> {room.type}</span>\n                      </li>\n                    ))}\n                  </ul>\n                </td>\n              ))}\n            </tr>\n            <tr>\n              {hotelInfo.map((data) => {\n                const ctaHref = data?.ctaHref;\n                const ctaLabel = data?.ctaLabel;\n                return (\n                  <td\n                    className=\"items-center gap-0.5 border-2 border-border p-2 text-sm\"\n                    key={ctaHref}\n                  >\n                    <div className=\"flex size-full flex-col justify-end gap-3 p-2 font-bold\">\n                      {ctaHref && ctaLabel ? (\n                        <Link\n                          url={ctaHref}\n                          className=\"btn btn-primary flex w-full justify-center no-underline\"\n                          target=\"_blank\"\n                          showNewWindowIcon={false}\n                        >\n                          {ctaLabel.text}\n                        </Link>\n                      ) : null}\n                      {showRemoveCTA ? (\n                        <button\n                          className=\"btn-primary-link hidden text-sm lg:block\"\n                          type=\"button\"\n                          onClick={() => onRemoveHotel(data?.ctyhocn)}\n                        >\n                          {t('remove')}\n                        </button>\n                      ) : null}\n                    </div>\n                  </td>\n                );\n              })}\n            </tr>\n          </table>\n        </div>\n      )}\n    </Dialog>\n  );\n};\n","import { useTranslation } from 'next-i18next';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\nimport { useState } from 'react';\nimport { DESKTOP_COMPARE_LIMIT, MOBILE_COMPARE_LIMIT } from './compare-hotel-utils';\nimport { CompareModal } from './compare-modal';\nimport type { GoogleCoordinate } from '../../utils';\n\ntype CompareBarProps = {\n  hotelsToCompare?: string[];\n  centerCoordinate: GoogleCoordinate | null;\n  onCompare?: () => void;\n  onStopCompare?: () => void;\n};\n\nexport const CompareBar = ({ onStopCompare, onCompare, centerCoordinate }: CompareBarProps) => {\n  const { t } = useTranslation('compare-hotels');\n  const isMobile = useMediaQuery('(max-width:640px)');\n  const [showCompareModal, setShowCompareModal] = useState<boolean>(false);\n  const { hotelsToCompare, compareHotelsToggle: showCompareBar } = useAppState();\n  const dispatch = useAppDispatch();\n\n  const selectHotelsBannerMessage = () => {\n    if (hotelsToCompare.length < 2) {\n      if (hotelsToCompare.length === 1) return t('selectOneMoreHotel');\n      return t('selectHotelsToStart');\n    }\n    return null;\n  };\n\n  const handleCompareHotels = () => {\n    if (onCompare) onCompare();\n    sendReward(GOALS.compareHotelsCTAClick);\n    setShowCompareModal(true);\n  };\n\n  const closeCompareModal = () => setShowCompareModal(false);\n\n  const handleStopComparing = () => {\n    if (hotelsToCompare.length) dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: [] });\n    closeCompareModal();\n    onStopCompare?.();\n  };\n\n  return showCompareBar && hotelsToCompare.length ? (\n    <>\n      <div\n        className=\"sticky bottom-0 z-10 flex w-full flex-col items-center justify-between gap-3 border-t-2 border-border bg-bg-alt p-4 md:flex-row\"\n        data-testId=\"compare-hotels-bar\"\n      >\n        {hotelsToCompare.length < 2 ? (\n          <InfoMessageBanner bannerClassName=\"bg-bg-alt gap-3 flex items-center pb-0 font-base\">\n            <span aria-live=\"assertive\"> {selectHotelsBannerMessage()} </span>\n          </InfoMessageBanner>\n        ) : (\n          <div aria-live=\"assertive\">\n            {t('numOfHotelsCompared', {\n              compareHotelsSelected: hotelsToCompare.length,\n              compareLimit: isMobile ? `${MOBILE_COMPARE_LIMIT}` : `${DESKTOP_COMPARE_LIMIT}`,\n            })}\n          </div>\n        )}\n        <div className=\"flex w-full flex-col gap-4 text-sm md:w-auto md:flex-row\">\n          {hotelsToCompare.length ? (\n            <button type=\"button\" onClick={handleStopComparing} className=\"btn-primary-link\">\n              {t('stopComparing')}\n            </button>\n          ) : null}\n          <button\n            type=\"button\"\n            className=\"btn-primary w-full rounded p-3 font-bold disabled:bg-text-disabled md:w-72 lg:w-[343px]\"\n            disabled={hotelsToCompare.length < 2}\n            onClick={handleCompareHotels}\n          >\n            {t('compareHotels')}\n          </button>\n        </div>\n      </div>\n      <CompareModal\n        centerCoordinate={centerCoordinate}\n        hotelsToCompare={[...hotelsToCompare]}\n        isOpen={showCompareModal}\n        onDismiss={closeCompareModal}\n        onStopCompare={onStopCompare}\n      />\n    </>\n  ) : null;\n};\n","import type * as React from 'react';\nimport { ControlNext, ControlBack } from '@dx-ui/osc-controls';\nimport { useTranslation } from 'next-i18next';\n\nexport type Pagination = {\n  /**\n   * `id` of the element pagination controls for usage with aria-controls\n   */\n  controls?: string;\n  /**\n   * Current active page (zero based)\n   */\n  current?: number;\n  /**\n   * The text displayed in front of the page numbers and used for a11y\n   */\n  label?: string;\n  /**\n   * Whether to visually hide the label\n   */\n  hideLabel?: boolean;\n  /**\n   * Controls whether or not to disable buttons at either end\n   */\n  loop?: boolean;\n  /**\n   * Total number of pages\n   */\n  total?: number;\n  /**\n   * When the page is selected from the dropdown\n   */\n  onChange?: (val: number) => void;\n  onPreviousClick?: React.DOMAttributes<HTMLButtonElement>['onClick'];\n  onNextClick?: React.DOMAttributes<HTMLButtonElement>['onClick'];\n  /** Pagination item id */\n  groupId?: string;\n};\n\n/**\n * Use when you need a control to cycle through \"pages\" or any paginated data.\n *\n * Pass the `current` page _(zero-based)_ and `total` pages, if you want to allow the select element to jump to a specific page, include the `onChange` callback. You can include listeners for `onPreviousClick` and `onNextClick` to change pages one by one.\n */\nexport const Pagination: React.FC<React.PropsWithChildren<Pagination>> = ({\n  controls,\n  loop,\n  onChange,\n  onPreviousClick,\n  onNextClick,\n  hideLabel,\n  current = 0,\n  total = 0,\n  label,\n  groupId,\n}) => {\n  const { t } = useTranslation('osc-pagination');\n  // eslint-disable-next-line prefer-spread\n  const pageNumbers = Array.apply(null, Array(total));\n  const prevDisabled = loop ? false : current === 0;\n  const nextDisabled = loop ? false : current === total - 1;\n\n  const paginationLabel = label ?? t('defaultLabel');\n\n  return (\n    <div className=\"pointer-events-auto flex items-center justify-center space-x-4\">\n      <div className=\"sr-only\" aria-live=\"polite\">{`${paginationLabel} ${t('count', {\n        current: current + 1,\n        total,\n      })}`}</div>\n      <ControlBack\n        id={groupId ? `pagination-left-${groupId}` : 'pagination-left'}\n        size=\"lg\"\n        aria-controls={controls}\n        onClick={onPreviousClick}\n        disabled={prevDisabled}\n        label={`${t('previousLabel', { label: paginationLabel })}, ${t('count', {\n          current: current - 1 < 0 ? total : current,\n          total,\n        })}`}\n      />\n      <div className=\"flex items-center justify-center\">\n        {onChange ? (\n          <>\n            {!hideLabel && <span className=\"pr-2\">{paginationLabel}</span>}\n            <label>\n              <span className=\"sr-only\">{t('prompt', { label: paginationLabel })}</span>\n              <select\n                aria-controls={controls}\n                className=\"form-select\"\n                value={current}\n                onBlur={(e) => onChange(parseInt(e.currentTarget.value, 10))}\n                onChange={(e) => onChange(parseInt(e.currentTarget.value, 10))}\n              >\n                {pageNumbers.map((_, index) => (\n                  // eslint-disable-next-line react/no-array-index-key\n                  <option key={index} value={index}>\n                    {index + 1}\n                  </option>\n                ))}\n              </select>\n            </label>\n            <span className=\"pl-2\">{t('count', { current: undefined, total })}</span>\n          </>\n        ) : (\n          <span className=\"text-center\">\n            {!hideLabel && `${paginationLabel} `}\n            <span className=\"tabular-nums\">{t('count', { current: current + 1, total })}</span>\n          </span>\n        )}\n      </div>\n      <ControlNext\n        id={groupId ? `pagination-right-${groupId}` : 'pagination-right'}\n        size=\"lg\"\n        aria-controls={controls}\n        onClick={onNextClick}\n        disabled={nextDisabled}\n        label={`${t('nextLabel', { label: paginationLabel })}, ${t('count', {\n          current: current + 1 >= total ? 1 : current + 2,\n          total,\n        })}`}\n      />\n    </div>\n  );\n};\n\nexport default Pagination;\n","export * from './lib/pagination';\n","import type { HotelType } from '../../../providers/app-provider/app-provider.types';\nimport type { GeocodeAddress } from '@dx-ui/queries-dx-shop-search-ui';\n\nexport const filterStateCountryBrandHashedHotels = (\n  address: Pick<GeocodeAddress, 'state' | '_id' | 'city' | 'country'> | null | undefined,\n  brandCode: string | undefined,\n  hashedHotelSummaryOptionsHotelData: Record<string, HotelType>\n) =>\n  Object.keys(hashedHotelSummaryOptionsHotelData || {})\n    .filter((ctyhocn) => {\n      const currentHotel = hashedHotelSummaryOptionsHotelData[ctyhocn];\n      if (brandCode && currentHotel && brandCode !== currentHotel.brandCode) return false;\n      if (address) {\n        if (\n          address?.country &&\n          address?.country !== hashedHotelSummaryOptionsHotelData[ctyhocn]?.address?.country\n        )\n          return false;\n        if (\n          address?.state &&\n          address?.state !== hashedHotelSummaryOptionsHotelData[ctyhocn]?.address?.state\n        )\n          return false;\n      }\n\n      return true;\n    })\n    .reduce((obj, key) => {\n      const hotel = hashedHotelSummaryOptionsHotelData[key];\n      if (hotel) obj[key] = hotel;\n      return obj;\n    }, {} as Record<string, HotelType>);\n\nexport const filterRegionHashedHotels = (\n  countriesInRegion: string[],\n  hashedHotelSummaryOptionsHotelData: Record<string, HotelType>\n) =>\n  Object.keys(hashedHotelSummaryOptionsHotelData || {})\n    .filter((ctyhocn) => {\n      const currentHotel = hashedHotelSummaryOptionsHotelData[ctyhocn];\n      return countriesInRegion?.includes(currentHotel?.address?.country || '');\n    })\n    .reduce((obj, key) => {\n      const hotel = hashedHotelSummaryOptionsHotelData[key];\n      if (hotel) obj[key] = hotel;\n      return obj;\n    }, {} as Record<string, HotelType>);\n","import { keepPreviousData, type UseQueryOptions } from '@tanstack/react-query';\nimport { isBrowser } from '@dx-ui/utilities-is-browser';\nimport type { HotelSummaryOptionsQuery, HotelQuadrant } from '@dx-ui/queries-dx-shop-search-ui';\nimport { HotelSummaryOptionsDocument } from '@dx-ui/queries-dx-shop-search-ui';\n\nexport const generateHotelSummaryOptionsQueryArray = ({\n  language,\n  enabled,\n  quadNodes,\n  guestLocationCountry,\n}: {\n  language: string;\n  enabled: boolean;\n  quadNodes?: HotelQuadrant[];\n  guestLocationCountry?: string;\n}) =>\n  quadNodes?.reduce((arr, node) => {\n    arr.push({\n      queryKey: [\n        HotelSummaryOptionsDocument,\n        {\n          language,\n          input: {\n            quadrantId: node?.id,\n            guestLocationCountry,\n          },\n        },\n      ],\n      enabled: isBrowser && enabled,\n      placeholderData: keepPreviousData,\n      retry: 2,\n    });\n    return arr;\n  }, [] as UseQueryOptions<HotelSummaryOptionsQuery>[]) || [];\n","import type { Maybe, HotelQuadrantBounds, HotelQuadrant } from '@dx-ui/queries-dx-shop-search-ui';\n\ntype NodeFilterCountry = {\n  countryCode: string;\n  stateCode?: string | null;\n};\n\ntype NodeFilter = {\n  brandCode?: string | null;\n  countries?: NodeFilterCountry[] | null;\n};\n\nexport type GoogleCoordinate = {\n  lat: number;\n  lng: number;\n};\n\n/**\n * Determines if two rectangular bounds intercept. Basically this method confirms that there is no overlap between rectangles and then returns the result logically NOT'ed.\n *\n * @param bounds1\n * @param bounds2\n */\nfunction isOverlappingBounds(\n  bounds1?: Maybe<HotelQuadrantBounds>,\n  bounds2?: Maybe<HotelQuadrantBounds>\n) {\n  return (\n    typeof bounds1?.northeast?.latitude !== 'undefined' &&\n    typeof bounds2?.southwest?.latitude !== 'undefined' &&\n    typeof bounds1?.southwest?.latitude !== 'undefined' &&\n    typeof bounds2?.northeast?.latitude !== 'undefined' &&\n    !(\n      bounds1?.northeast?.latitude < bounds2?.southwest?.latitude ||\n      bounds1?.southwest?.latitude > bounds2?.northeast?.latitude ||\n      bounds1?.southwest?.longitude > bounds2?.northeast?.longitude ||\n      bounds1?.northeast?.longitude < bounds2?.southwest?.longitude\n    )\n  );\n}\n\n/**\n * Determines if the quad node matches the filter criteria.\n *\n * @param {HotelQuadrant} validNode\n * @param {NodeFilter} filter\n */\nfunction isMatchFilter(validNode: HotelQuadrant, filter?: NodeFilter) {\n  let brandCodeMatch = true;\n  let stateOrCountryMatch = true;\n  if (filter) {\n    // Filter by brand codes if provided\n    if (filter?.brandCode) {\n      brandCodeMatch = Boolean(validNode?.brands.find((brand) => brand.code === filter?.brandCode));\n    }\n    // Filter by country/state if provided\n    if (brandCodeMatch && filter.countries && validNode.countries) {\n      stateOrCountryMatch = filter.countries.some((c) => {\n        const nodeCountry = validNode?.countries?.find(\n          (nodeCountry) => nodeCountry.code === c.countryCode\n        );\n        return !!(nodeCountry && (!c.stateCode || nodeCountry?.states?.includes(c.stateCode)));\n      });\n    }\n  }\n  return brandCodeMatch && stateOrCountryMatch;\n}\n\n/**\n * Determines the list of quad tree nodes within the bounds provided. Able to also further filter nodes by a list of brands, states, or countries.\n *\n * @param {HotelQuadrant[]} validNodes\n * @param {Maybe<HotelQuadrantBounds>} bounds\n * @param {NodeFilter} filter\n */\nconst getBoundNodes = (\n  validNodes: HotelQuadrant[],\n  bounds: Maybe<HotelQuadrantBounds>,\n  filter?: NodeFilter\n): HotelQuadrant[] => {\n  //if we dont have any nodes or a value for bounds is missing return an empty arr\n  if (validNodes.length === 0 || !bounds?.northeast || !bounds.southwest) return [];\n\n  // If the bounding box crosses the international time line, create a bounding box for each side of the time line,\n  // and get the quad nodes for each.\n  const { southwest, northeast } = bounds || {};\n\n  if (southwest?.longitude && northeast?.longitude && southwest?.longitude > northeast?.longitude) {\n    return [\n      ...getBoundNodes(\n        validNodes,\n        { southwest, northeast: { ...northeast, longitude: 180 } },\n        filter\n      ),\n      ...getBoundNodes(\n        validNodes,\n        { southwest: { ...southwest, longitude: -180 }, northeast },\n        filter\n      ),\n    ];\n  }\n\n  // Filter quad nodes based on whether it overlaps with the provided bounding box and matches the filter criteria.\n  return validNodes\n    .filter((validNode) => isOverlappingBounds(validNode?.bounds, bounds))\n    .filter((validNode) => isMatchFilter(validNode, filter));\n};\n\nexport default getBoundNodes;\n","import { useIsClient } from 'usehooks-ts';\nimport { useHotelQuadrantsQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { generateHotelSummaryOptionsQueryArray } from './utils/generate-hotel-summary-options-query-array';\nimport { useQueries } from '@tanstack/react-query';\nimport getBoundNodes from '../../utils/get-bounds-nodes/get-bounds-nodes';\nimport { toNestedBounds } from '../../providers/app-provider/app-provider.utils';\nimport { useLocation } from '@dx-ui/framework-location-provider';\n\nexport const useQuadNodes = ({\n  language,\n  enabled,\n  bounds,\n  brandCode,\n  stateOrCountryOrRegionFilter,\n}: {\n  language: string;\n  enabled: boolean;\n  bounds: google.maps.LatLngBoundsLiteral;\n  brandCode?: string;\n  stateOrCountryOrRegionFilter:\n    | {\n        countries:\n          | {\n              countryCode: string;\n              stateCode: string;\n            }[]\n          | null;\n      }\n    | undefined;\n}) => {\n  const isClient = useIsClient();\n\n  const { country: guestLocationCountry, isLoading: isGuestLocationLoading } = useLocation();\n\n  const { data: quadNodesData, isLoading: isQuadNodesDataLoading } = useHotelQuadrantsQuery(\n    {},\n    {\n      enabled: isClient && enabled,\n    }\n  );\n  const quadNodes = getBoundNodes(quadNodesData?.hotelQuadrants || [], toNestedBounds(bounds), {\n    ...stateOrCountryOrRegionFilter,\n    brandCode,\n  });\n\n  const isHotelSummaryQueryEnabled =\n    Boolean(quadNodesData) && enabled && !isQuadNodesDataLoading && !isGuestLocationLoading;\n\n  const queryArr = generateHotelSummaryOptionsQueryArray({\n    language,\n    enabled: isHotelSummaryQueryEnabled,\n    quadNodes,\n    guestLocationCountry,\n  });\n  //parallel fetch zoned hotel summary options\n  const results = useQueries({ queries: queryArr });\n\n  return {\n    isFetching: results.some((result) => result.isFetching),\n    isInitialRender: results.some(\n      (result) => result.status === 'success' || result.status === 'error'\n    ),\n  };\n};\n","import { useQuery } from '@tanstack/react-query';\nimport type { THsoHotel } from './utils/get-hashed-hotel-summary-options-data-from-cache';\nimport { logError } from '@dx-ui/framework-logger';\n\nconst fetchHotelSummaryOptions = async ({\n  queryKey,\n}: {\n  queryKey: [string];\n}): Promise<THsoHotel> => {\n  const [url] = queryKey;\n\n  const response = await fetch(url);\n\n  if (!response.ok) {\n    logError(\n      'Shop HSO blob fetch',\n      `${response.status}: ${response.statusText}`,\n      'failed to fetch blob'\n    );\n    throw new Error(`Error ${response.status}: ${response.statusText}`);\n  }\n\n  return response.json();\n};\n\nexport const useBlob = ({\n  enabled,\n  hotelSummaryExtractUrl,\n}: {\n  enabled: boolean;\n  hotelSummaryExtractUrl: string;\n}) => {\n  const { isFetching, status, data } = useQuery({\n    queryKey: [hotelSummaryExtractUrl],\n    queryFn: fetchHotelSummaryOptions,\n    enabled,\n  });\n\n  return {\n    data,\n    isFetching,\n    isInitialRender: status === 'success' || status === 'error',\n    status,\n  };\n};\n","import { useQueryClient } from '@tanstack/react-query';\nimport type { GeocodeAddress, GeocodePlaceType } from '@dx-ui/queries-dx-shop-search-ui';\nimport { getHashedHotelSummaryOptionsDataFromCache } from './utils/get-hashed-hotel-summary-options-data-from-cache';\n\nimport {\n  filterStateCountryBrandHashedHotels,\n  filterRegionHashedHotels,\n} from './utils/filter-state-country-brand-hashed-hotels';\nimport * as React from 'react';\nimport { useGetRegions } from '../use-get-regions';\nimport { useQuadNodes } from './use-quad-nodes';\nimport { useBlob } from './use-blob';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\n\nconst useHotelSummaryOptions = ({\n  initialHashedHotelSummaryOptionsData,\n  bounds,\n  brandCode,\n  language,\n  address,\n  type,\n  isInitialRender,\n  matchName,\n  blobEnabled = false,\n  hotelSummaryExtractUrl,\n}: {\n  initialHashedHotelSummaryOptionsData: Record<string, HotelType>;\n  bounds: google.maps.LatLngBoundsLiteral;\n  brandCode?: string;\n  language: string;\n  address: Pick<GeocodeAddress, '_id' | 'city' | 'country' | 'state'> | null | undefined;\n  type: GeocodePlaceType | undefined;\n  isInitialRender: React.MutableRefObject<boolean>;\n  matchName?: string;\n  blobEnabled?: boolean;\n  hotelSummaryExtractUrl?: string;\n}) => {\n  const isRegions = type === 'region';\n  const { countryCodes: countriesInRegion } = useGetRegions({\n    isTypeRegion: isRegions,\n    regionName: matchName || '',\n    isEnabled: isRegions,\n  });\n  const queryClient = useQueryClient();\n\n  const stateOrCountryFilter =\n    address && !isRegions\n      ? {\n          countries: ['country', 'state'].includes(type || '')\n            ? [{ countryCode: address?.country || '', stateCode: address?.state || '' }]\n            : null,\n        }\n      : undefined;\n\n  let stateOrCountryOrRegionFilter = stateOrCountryFilter;\n  if (isRegions) {\n    stateOrCountryOrRegionFilter = {\n      countries:\n        countriesInRegion?.map((country) => ({\n          countryCode: country,\n          stateCode: '',\n        })) || null,\n    };\n  }\n  const isBlobEnabledWithExtractURL = !!hotelSummaryExtractUrl && blobEnabled;\n  const {\n    data: blobData,\n    isFetching: isFetchingBlobNodes,\n    isInitialRender: isInitialRenderBlobNodes,\n    status: blobStatus,\n  } = useBlob({\n    enabled: isBlobEnabledWithExtractURL,\n    hotelSummaryExtractUrl: hotelSummaryExtractUrl ?? '',\n  });\n\n  const isFallbackToNodes = !isBlobEnabledWithExtractURL || blobStatus === 'error';\n  const { isFetching: isFetchingQuadNodes, isInitialRender: isInitialRenderQuadNodes } =\n    useQuadNodes({\n      language,\n      enabled: isFallbackToNodes,\n      bounds,\n      brandCode,\n      stateOrCountryOrRegionFilter,\n    });\n\n  const { isFetching, isInitial } = !isFallbackToNodes\n    ? { isFetching: isFetchingBlobNodes, isInitial: isInitialRenderBlobNodes }\n    : { isFetching: isFetchingQuadNodes, isInitial: isInitialRenderQuadNodes };\n\n  if (isInitial) isInitialRender.current = false;\n\n  const hotelDataToUse =\n    !isFallbackToNodes && blobData\n      ? blobData\n      : getHashedHotelSummaryOptionsDataFromCache(\n          queryClient,\n          initialHashedHotelSummaryOptionsData\n        );\n\n  const filteredHotelDataToUse = React.useMemo(() => {\n    if (isFetching) return {};\n    return isRegions && countriesInRegion\n      ? filterRegionHashedHotels(countriesInRegion, hotelDataToUse)\n      : filterStateCountryBrandHashedHotels(address, brandCode, hotelDataToUse);\n  }, [address, brandCode, countriesInRegion, hotelDataToUse, isFetching, isRegions]);\n\n  return {\n    hashedHotelSummaryOptionsHotelData: filteredHotelDataToUse,\n    isFetching,\n  };\n};\n\nexport default useHotelSummaryOptions;\n","import { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { useIsClient, useMediaQuery } from 'usehooks-ts';\nimport cx from 'classnames';\nimport { Icon, type IconNames } from '@dx-ui/osc-icon';\nimport { useMapListToggle } from '../../hooks';\n\nexport const MapListToggleButton = ({\n  showMapListToggleButton = true,\n  className,\n}: {\n  showMapListToggleButton?: boolean;\n  className?: string;\n}) => {\n  const { isListVisible } = useAppState();\n  const dispatch = useAppDispatch();\n  const isClient = useIsClient();\n  const isSlimView = useMediaQuery('(max-width: 767px)');\n\n  const { iconName: listMapViewButtonIconName, label: listMapViewButtonLabel } = useMapListToggle();\n  const mapToggleButtonArrowDirection = listMapViewButtonIconName as (typeof IconNames)[number];\n\n  return isClient && showMapListToggleButton ? (\n    <button\n      className={cx(\n        'btn flex items-center justify-center rtl:ml-0 rtl:mr-auto',\n        {\n          'md:hidden btn-primary': isSlimView,\n          ' btn-text-outline text-base text-text px-3 py-2 shadow-xl bg-bg hover:text-text focus:text-text':\n            !isSlimView,\n        },\n        className\n      )}\n      onClick={() => {\n        dispatch({ type: 'SET_IS_LIST_VISIBLE', payload: !isListVisible });\n      }}\n      type=\"button\"\n    >\n      {listMapViewButtonLabel}\n      {!isSlimView ? <Icon name={mapToggleButtonArrowDirection} /> : null}\n    </button>\n  ) : null;\n};\n","import type { HotelType } from '../../../providers/app-provider/app-provider.types';\n\nexport const shouldDisplayBrandedHotels = (brandName: string | undefined): boolean => {\n  if (brandName !== 'hilton-honors') {\n    return true;\n  }\n  return false;\n};\n\nexport const getBrandedHotels = (\n  hotelPageCards: HotelType[],\n  brandCode: string | undefined,\n  brandName: string | undefined\n): HotelType[] =>\n  shouldDisplayBrandedHotels(brandName)\n    ? hotelPageCards.filter((hotel) => hotel.brandCode === brandCode)\n    : [];\n\nexport const getOtherHotels = (\n  hotelPageCards: HotelType[],\n  brandCode: string | undefined,\n  brandName: string | undefined\n): HotelType[] =>\n  shouldDisplayBrandedHotels(brandName)\n    ? hotelPageCards.filter((hotel) => hotel.brandCode !== brandCode)\n    : hotelPageCards;\n\n//link for no branded hotels found info banner that removes brand slug from uri\nexport const getInfoBannerURLWithBrandRemoved = ({\n  baseUrl,\n  path,\n  locale = 'en',\n  canonicalSlug = '',\n  altSlugs = [],\n  brandCode,\n}: {\n  baseUrl: string;\n  path: string;\n  locale?: string;\n  canonicalSlug?: string | null;\n  altSlugs?: string[];\n  brandCode?: string;\n}) => {\n  //remove brand filter param from URL\n  const newURL = path.replace(`&f-brandCodes=${brandCode}`, '');\n  //remove slug from URL\n  if (canonicalSlug && newURL.includes(canonicalSlug))\n    return encodeURI(`${baseUrl}${locale}${newURL.replace(`${canonicalSlug}/`, '')}`);\n  const slug = altSlugs?.find((slug) => newURL.includes(slug)) ?? '';\n  return encodeURI(`${baseUrl}${locale}${newURL.replace(`${slug}/`, '')}`);\n};\n","import { useBrandDetails, useWrappedRouter } from '../../../hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useAppState } from '../../../providers/app-provider';\nimport { InfoMessageBanner } from '../../info-message-banner/info-message-banner';\nimport { Link } from '@dx-ui/osc-link';\nimport { env } from '../../../constants';\nimport { getInfoBannerURLWithBrandRemoved } from '../list-view-utils/list-view-brand-banner.utils';\n\nexport type ListViewBrandBannerProps = {\n  numBrandedHotels: number;\n  brandCode: string | undefined;\n  isDisplayBrandBanner?: boolean;\n  isPageBrandFilterEnabled?: boolean;\n  isEndOfResults?: boolean;\n};\n\nexport const ListViewBrandBanner = ({\n  numBrandedHotels,\n  brandCode,\n  isDisplayBrandBanner,\n  isPageBrandFilterEnabled,\n  isEndOfResults = false,\n}: ListViewBrandBannerProps) => {\n  const { pageType } = useAppState();\n  const brandInfo = useBrandDetails({ brandCode });\n  const { t } = useTranslation(['list-view-brand-banner', 'list-view']);\n  const { isGlobal: isGlobalPage } = pageType;\n  const {\n    router: { asPath, locale },\n  } = useWrappedRouter();\n\n  const atLeastOneBrandedHotel = numBrandedHotels > 0;\n\n  const infoBannerMessage = atLeastOneBrandedHotel\n    ? t('list-view-brand-banner:endOfBrandedHotelsResults', { brandName: brandInfo.name })\n    : t('list-view-brand-banner:couldNotFindHotelsInSearchArea', { brandName: brandInfo.name });\n\n  const linkWithoutBrandSlug = pageType.isBrand ? (\n    <Link\n      url={getInfoBannerURLWithBrandRemoved({\n        baseUrl: env.OHW_BASE_URL,\n        path: asPath,\n        locale,\n        canonicalSlug: brandInfo.canonicalSlug,\n        altSlugs: brandInfo.altSlugs,\n        brandCode,\n      })}\n      className=\"px-2 text-sm font-normal\"\n    >\n      {t('exploreOtherHotelsLink')}\n    </Link>\n  ) : null;\n\n  return isDisplayBrandBanner && isPageBrandFilterEnabled && isEndOfResults\n    ? ((!!brandInfo?.isHotelBrand && !!brandInfo?.hasHotels) || isGlobalPage) && (\n        <InfoMessageBanner message={infoBannerMessage}>{linkWithoutBrandSlug}</InfoMessageBanner>\n      )\n    : null;\n};\n","export * from './list-view-brand-banner';\n","import type { QueryParameters } from '../../constants';\n\nimport type { ShopMultiPropAvailPointsQuery } from '@dx-ui/queries-dx-shop-search-ui';\n\nexport const hasAgeBased = (\n  queryParameters?: QueryParameters,\n  pricing?: Record<string, ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0]>\n): boolean => {\n  if (queryParameters)\n    return Object.values(pricing || {}).filter((price) => price?.ageBasedPricing).length > 0;\n  return false;\n};\n\nexport const hasChildAges = (queryParameters?: QueryParameters): boolean =>\n  (queryParameters &&\n    queryParameters.rooms\n      .filter(({ children, childAges }) => {\n        if (children > 0) {\n          return (\n            childAges &&\n            typeof childAges !== 'number' &&\n            childAges.filter(({ age }) => typeof age !== 'undefined').length !== children\n          );\n        }\n        return false;\n      })\n      .filter(Boolean).length > 0) ||\n  false;\n\nexport const hasTMTPRatesSelected = (queryParameters: QueryParameters): boolean =>\n  queryParameters &&\n  (queryParameters.employeeRate ||\n    queryParameters.friendsAndFamilyRate ||\n    queryParameters.ownerVIPRate);\n","import type { MapLanguage, BrandCode, SortByValues, Child } from '@dx-ui/framework-uri-builder';\nimport { searchUriBuilder } from '@dx-ui/framework-uri-builder';\nimport { RoomsModal } from '@dx-ui/osc-rooms';\nimport { parseISO } from 'date-fns';\nimport isNumber from 'lodash/isNumber';\nimport { useTranslation } from 'next-i18next';\nimport * as React from 'react';\nimport type { QueryParameters } from '../../constants';\nimport type { ShopMultiPropAvailQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { useBrandDetails, useWrappedRouter } from '../../hooks';\nimport { getTARatingValue, getValidFilters, isPriceRangeValid } from '../filters/filter-utils';\nimport { hasAgeBased, hasChildAges, hasTMTPRatesSelected } from './age-based-modal-utils';\nimport { mapRatesToSearchUriBuilder } from '../osc-search-form/search-form.utils';\nimport { useAppState } from '../../providers/app-provider';\nimport type { FieldValues } from 'react-hook-form';\nimport { useFilterState } from '../../providers/filter-provider';\n\nconst AgeBasedModal = ({\n  isAgeBasedModalOpen,\n  setIsAgeBasedModalOpen,\n  pricing,\n}: {\n  isAgeBasedModalOpen: boolean;\n  setIsAgeBasedModalOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  pricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>;\n}) => {\n  const { t } = useTranslation(['hotel-card', 'osc-shop-form-wrapper']);\n  const { hasConnectingRooms, selectedCurrency, sortType, shouldUsePoints } = useAppState();\n  const activeFiltersState = useFilterState();\n\n  const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n  const isAgeBased = hasAgeBased(queryParameters, pricing) && hasChildAges(queryParameters);\n\n  const { code: brandCode } = useBrandDetails({});\n\n  React.useEffect(() => {\n    if (isAgeBased) {\n      setIsAgeBasedModalOpen(isAgeBased);\n    }\n  }, [queryParameters, pricing, isAgeBased, setIsAgeBasedModalOpen]);\n\n  const roomInfo =\n    queryParameters &&\n    queryParameters.rooms.map((room) => ({\n      adults: room.adults,\n      kids: room.children,\n      childAges: room.childAges?.map(({ age }) => ({ age: isNumber(age) ? age : '' })),\n    }));\n\n  const handleRoomInfoSubmit = (data: FieldValues) => {\n    const roomInfo = data?.rooms?.map((room: { adults: number; children: Child[] }) => ({\n      adults: room?.adults,\n      children: room?.children,\n    }));\n\n    const path =\n      window.location.pathname.split('/').includes('go-hilton') ||\n      hasTMTPRatesSelected(queryParameters as QueryParameters)\n        ? 'go-hilton'\n        : 'search';\n\n    if (queryParameters) {\n      const { offerId, pnd, specPlan, fromId, travelAgentId, requestedRatesOnly } = queryParameters;\n\n      const url = searchUriBuilder({\n        brandCode: brandCode as keyof BrandCode,\n        locale: router.locale as MapLanguage,\n        urlParams: {\n          content: queryParameters?.content,\n          dates: {\n            arrivalDate: parseISO(queryParameters.arrivalDate),\n            departureDate: parseISO(queryParameters.departureDate),\n            flexibleDates: queryParameters.datesFlex,\n          },\n          placeId: queryParameters.placeId,\n          query: queryParameters.query,\n          sortBy: sortType as SortByValues,\n          f_amenityIds: getValidFilters(activeFiltersState?.amenityFilters),\n          f_brandCodes: getValidFilters(activeFiltersState?.brandFilters),\n          f_price: isPriceRangeValid(activeFiltersState?.priceFilter)\n            ? activeFiltersState?.priceFilter\n            : undefined,\n          f_tripAdvisorRatings: getTARatingValue(activeFiltersState?.ratingsFilter),\n          availableHotelsOnly: activeFiltersState?.showAvailableHotels,\n          rates: {\n            ...mapRatesToSearchUriBuilder(queryParameters, shouldUsePoints),\n            ...(offerId ? { offerId } : {}),\n            ...(pnd ? { pnd } : {}),\n            ...(specPlan ? { spec_plan: specPlan.join(',') } : {}),\n            ...(fromId ? { fromId } : {}),\n            ...(travelAgentId ? { travelAgentId } : {}),\n            ...(requestedRatesOnly ? { requestedRatesOnly } : {}),\n          },\n          numRooms: roomInfo?.length || 1,\n          rooms: roomInfo,\n          sessionToken: queryParameters.sessionToken,\n          specialRateTokens: queryParameters.specialRateTokens,\n          displayCurrency: selectedCurrency || '',\n          adjoiningRoomStay: hasConnectingRooms,\n          maxPoints: queryParameters.maxPoints,\n        },\n        path,\n        relative: true,\n      });\n\n      window.location.href = url;\n    }\n  };\n\n  return isAgeBasedModalOpen ? (\n    <RoomsModal\n      ageRange={{ min: 0, max: 18 }}\n      agesRequired\n      ariaLabel={t('hotel-card:roomModalAria')}\n      isOpen\n      occupancyLimitMessage={t('osc-shop-form-wrapper:maxGuestsSingleRoom')}\n      onSubmit={handleRoomInfoSubmit}\n      useFormProps={{\n        defaultValues: {\n          rooms: roomInfo?.map((room) => ({\n            adults: room.adults,\n            children: room.childAges.map((child) => ({\n              age: child?.age,\n            })),\n          })),\n        },\n      }}\n    />\n  ) : null;\n};\n\nexport { AgeBasedModal };\n","export * from './age-based-modal';\n","export const setFocusOnFirstListViewCard = (\n  ulContainerRef: React.MutableRefObject<HTMLDivElement | null>\n) => {\n  const firstHotelCardItem = ulContainerRef?.current?.querySelector('li');\n  if (firstHotelCardItem) {\n    firstHotelCardItem.setAttribute('tabindex', '0');\n    firstHotelCardItem.focus();\n  }\n};\n","import { useMemo } from 'react';\nimport type { HotelType } from '../providers/app-provider/app-provider.types';\nimport {\n  getBrandedHotels,\n  getOtherHotels,\n} from '../components/list-view/list-view-utils/list-view-brand-banner.utils';\n\ntype GetVisibleInBoundHotelsProps = {\n  currentPageVisibleHotels: HotelType[];\n  brandCode: string | undefined;\n  brandName: string | undefined;\n};\n\nexport const useGetVisibleInBoundHotels = ({\n  currentPageVisibleHotels,\n  brandCode,\n  brandName,\n}: GetVisibleInBoundHotelsProps) => {\n  const brandedVisibleHotels = useMemo(\n    () => getBrandedHotels(currentPageVisibleHotels, brandCode, brandName),\n    [currentPageVisibleHotels, brandCode, brandName]\n  );\n\n  const otherVisibleHotels = useMemo(\n    () => getOtherHotels(currentPageVisibleHotels, brandCode, brandName),\n    [currentPageVisibleHotels, brandCode, brandName]\n  );\n\n  return { brandedVisibleHotels, otherVisibleHotels };\n};\n","import * as React from 'react';\n\nimport type { HotelImageRatio, Maybe } from '@dx-ui/queries-dx-shop-search-ui';\nimport { CarouselSingle } from '@dx-ui/osc-carousel';\nimport { getAspectRatioUrl } from '@dx-ui/utilities-images';\nimport { useRect } from '@dx-ui/utilities-use-rect';\nimport { env } from '../../constants';\nimport { useTranslation } from 'next-i18next';\n\nexport type IHotelImagesVariants =\n  | {\n      altText?: string | null;\n      size?: 'xs' | 'sm' | 'md';\n      ratios?: Maybe<Pick<HotelImageRatio, 'url' | 'size'>[]> | undefined;\n    }\n  | undefined;\n\ntype ICarousel = {\n  images?: IHotelImagesVariants[];\n  isLoading?: boolean;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst Carousel = ({ images, isLoading }: ICarousel) => {\n  const carouselRef = React.useRef<HTMLDivElement | null>(null);\n  const rect = useRect({ ref: carouselRef });\n\n  const { t } = useTranslation(['osc-carousel']);\n  const noPhotoImageUrl = `${env.HILTON_ASSETS_URI}/modules/assets/img/common/no-photo-available.png`;\n  const carouselImages = images\n    ?.map((props) => {\n      const { imgUrl } = getAspectRatioUrl({\n        src: props?.ratios?.[0]?.url,\n        width: rect?.width ?? 0,\n      });\n      const src = props?.ratios?.[0]?.url ? imgUrl : null;\n      return { alt: props?.altText || t('noPhotoAvailable'), url: src || noPhotoImageUrl };\n    })\n    .filter((image) => image.url);\n  return carouselImages && carouselImages?.length >= 1 ? (\n    <div ref={carouselRef}>\n      <CarouselSingle\n        data-testid=\"imageCarousel\"\n        images={carouselImages || []}\n        isLoading={isLoading}\n      />\n    </div>\n  ) : null;\n};\n\nexport default Carousel;\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { DESKTOP_COMPARE_LIMIT, MOBILE_COMPARE_LIMIT } from './compare-hotel-utils';\n\ntype CompareCheckboxProps = {\n  ctyhocn?: string;\n  onChange?: () => void;\n  isFirstCheckbox?: boolean;\n};\n\nexport const CompareHotelsCheckbox = ({\n  onChange,\n  ctyhocn: selectedCtyhocn,\n}: CompareCheckboxProps) => {\n  const { t } = useTranslation('compare-hotels');\n  const isSubDesktop = useMediaQuery('(max-width: 1023px)');\n\n  const { hotelsToCompare, compareHotelsToggle: showCompareCheckBox } = useAppState();\n  const dispatch = useAppDispatch();\n\n  const handleCompareHotelChange = () => {\n    if (onChange) onChange();\n\n    if (selectedCtyhocn) {\n      let selectedHotels = [...hotelsToCompare];\n      if (hotelsToCompare.includes(selectedCtyhocn))\n        selectedHotels = hotelsToCompare?.filter((hotel) => hotel !== selectedCtyhocn);\n      else selectedHotels.push(selectedCtyhocn);\n      dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: selectedHotels });\n      if (selectedHotels.length) sendReward(GOALS.compareHotelsCheckboxSelected);\n    }\n  };\n  const isCompareCBChecked = selectedCtyhocn ? !!hotelsToCompare?.includes(selectedCtyhocn) : false;\n  //Disable checkbox when hotels selected is 2 for mobile and  5 selected for other large device\n  const isCompareCBDisabled =\n    !isCompareCBChecked &&\n    (isSubDesktop\n      ? hotelsToCompare?.length >= MOBILE_COMPARE_LIMIT\n      : hotelsToCompare?.length === DESKTOP_COMPARE_LIMIT);\n\n  return showCompareCheckBox ? (\n    <div className=\"mr-0 pt-1.5 rtl:mb-2\">\n      <div className=\"flex\">\n        <label className=\"label label-inline-reverse rtl:label-inline-reverse\">\n          <span className={cx('text-base font-semibold rtl:pl-2 rtl:pr-1')}>{t('compare')}</span>\n          <input\n            className=\"form-checkbox\"\n            checked={isCompareCBChecked}\n            disabled={isCompareCBDisabled}\n            onChange={handleCompareHotelChange}\n            type=\"checkbox\"\n          />\n        </label>\n      </div>\n    </div>\n  ) : null;\n};\n","import Icon, { AmenityIcons } from '@dx-ui/osc-icon';\nimport type { HotelAmenityId } from '@dx-ui/queries-dx-shop-search-ui';\n\ntype HotelAmenities = { name: string; id: string };\n\nconst KEY_AMENITIES = {\n  freeParking: { id: 'freeParking', name: 'Free parking' },\n  freeBreakfast: { id: 'freeBreakfast', name: 'Free breakfast' },\n  indoorPool: { id: 'indoorPool', name: 'Indoor pool' },\n  outdoorPool: { id: 'outdoorPool', name: 'Outdoor pool' },\n} as unknown as Record<string, HotelAmenities>;\n\nexport const KeyHotelAmenities = ({ amenities }: { amenities: HotelAmenityId[] | undefined }) => {\n  const keyAmenities: HotelAmenities[] = [];\n  amenities?.forEach((amenityId) => {\n    if (Object.keys(KEY_AMENITIES).includes(amenityId)) {\n      keyAmenities.push(KEY_AMENITIES[amenityId] as HotelAmenities);\n    }\n  });\n\n  return keyAmenities?.length ? (\n    <div className=\"flex flex-wrap gap-1.5 py-2.5 pb-1.5\" data-testid=\"key-hotel-amenities\">\n      {keyAmenities.map((amenity: HotelAmenities) => (\n        <div key={amenity.id} className=\"flex items-center gap-0.5 text-sm\">\n          <Icon name={AmenityIcons[amenity.id as HotelAmenityId]} size=\"sm\" />\n          <span> {amenity?.name}</span>\n        </div>\n      ))}\n    </div>\n  ) : null;\n};\n","import { useGetMVTSelections } from '../../../hooks';\nimport { VIEW_HOTEL_DETAILS_LINK } from '../../../constants';\n\nexport const useGetViewHotelDetailsLinkMVT = () => {\n  const {\n    isLoaded: isViewHotelDetailsTestLoaded,\n    isMVTVariant: { a: isViewHotelDetailsVarA, b: isViewHotelDetailsVarB },\n  } = useGetMVTSelections({\n    agentId: VIEW_HOTEL_DETAILS_LINK.agentId,\n  });\n  const isViewHotelDetailsTestVarB = isViewHotelDetailsTestLoaded && isViewHotelDetailsVarB;\n  const isViewHotelDetailsTest =\n    isViewHotelDetailsTestLoaded && (isViewHotelDetailsVarA || isViewHotelDetailsVarB);\n\n  return {\n    isViewHotelDetailsTest,\n    isViewHotelDetailsTestVarB,\n  };\n};\n","import { useTranslation } from 'next-i18next';\nimport cx from 'classnames';\nimport type { Maybe, ShopMultiPropAvailPointsQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport Carousel from '../carousel/carousel';\nimport { HotelBadges } from './hotel-badges';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { useMediaQuery } from 'usehooks-ts';\nimport { TripAdvisorRating } from '../trip-advisor/trip-advisor-rating';\nimport { useMetrics } from '../../hooks';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport type { RateInfoMessage } from '../rate-name-cta/rate-name-cta';\nimport { RateNameCTA } from '../rate-name-cta/rate-name-cta';\nimport { useGetHotelInfo } from './hooks/use-get-hotel-info';\nimport { CompareHotelsCheckbox } from '../compare-hotels/compare-checkbox';\nimport { useRecentlyViewed } from '../../hooks/use-recently-viewed';\nimport { KeyHotelAmenities } from './key-hotel-amenity-info';\nimport { useEffect } from 'react';\nimport { logWarning } from '@dx-ui/framework-logger';\nimport { useGetViewHotelDetailsLinkMVT } from './hooks/use-view-hotel-details-link-mvt';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\n\nconst preventNavigation = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n  e.preventDefault();\n};\nconst preventFocus = (e: React.FocusEvent<HTMLAnchorElement>) => {\n  e.preventDefault();\n  e.target.blur();\n};\n\nconst HotelNameHeader = ({\n  children,\n  name,\n  url,\n}: {\n  children: React.ReactElement;\n  name?: string | null;\n  url?: Maybe<string>;\n}) => {\n  if (url) {\n    return (\n      <>\n        {/* This is a bit 'hacky'. We need a link in the page for SEO, but it is non-functional when JS is enabled */}\n        <a\n          aria-hidden=\"true\"\n          className=\"cursor-default\"\n          href={url}\n          onClick={preventNavigation}\n          onFocus={preventFocus}\n          tabIndex={-1}\n        >\n          {children}\n        </a>\n        {/* For a11y, we're hiding the above link (since it behaves as text) and supplementing it with sr-only content */}\n        <h3 className=\"sr-only\">{name}</h3>\n      </>\n    );\n  }\n  return children;\n};\n\ntype HotelCardProps = {\n  distance?: string;\n  isTALoadingState?: boolean;\n  onDetailsClick?: () => void;\n  showImages?: boolean;\n  isListViewOnly?: boolean;\n  priceInfo?: ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0] | null;\n  hotelInfo?: HotelType | null | undefined;\n};\n\nconst HotelCard = ({\n  distance,\n  isTALoadingState,\n  onDetailsClick,\n  showImages,\n  isListViewOnly,\n  priceInfo,\n  hotelInfo,\n}: HotelCardProps) => {\n  const { t } = useTranslation(['hotel-card']);\n  const { pageType } = useAppState();\n  const smMedViewPort = useMediaQuery('(min-width: 500px) and (max-width: 767px)');\n  const metrics = useMetrics();\n  const dispatch = useAppDispatch();\n\n  const {\n    amenities,\n    badges,\n    carouselImages,\n    ctaLabel,\n    ctaHref,\n    ctaMessage,\n    customParams,\n    hotelUrl,\n    isHotelDataLoading,\n    masterImage,\n    rateInfo,\n    disclaimerMessages,\n    transactionPropertyData,\n  } = useGetHotelInfo({\n    priceInfo,\n    hotelInfo,\n    additionalParams: { isHotelCard: true },\n  });\n\n  //NHCSEARCH-5793\n  const { isViewHotelDetailsTestVarB } = useGetViewHotelDetailsLinkMVT();\n\n  const hasNoRateInfo =\n    !ctaLabel &&\n    (!rateInfo || rateInfo.length === 0) &&\n    !!priceInfo &&\n    priceInfo?.summary?.status?.type !== 'NOT_BOOKABLE_ONLINE';\n  useEffect(() => {\n    if (hasNoRateInfo)\n      logWarning('Shop_Search_UI-Hotel', `${ctyhocn} Rate details missing`, 'hotel with no price');\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [hasNoRateInfo]);\n\n  const hotelName = hotelInfo?.name || '';\n  const tripAdvisorLocationSummary = hotelInfo?.tripAdvisorLocationSummary || null;\n  const ctyhocn = hotelInfo?.ctyhocn;\n  const classname = {\n    rateNameClassName: 'mt-auto w-1/2 sm:w-full md:mt-0 md:w-3/5 xl:w-auto',\n    propertyNameClassName: 'w-1/2 sm:w-full md:w-2/5 xl:flex-grow rtl:mr-2',\n    hotelCardContentClassName: cx('flex w-full items-end', {\n      'sm:flex-col': !showImages && !isListViewOnly,\n      'sm:justify-end md:flex-row': showImages && !isListViewOnly,\n    }),\n    wrapperHotelCardHeaderAndCardContentClassName: cx(\n      'w-full content-end lg:grid lg:h-full lg:grid-cols-1',\n      {\n        'px-2.5 py-1': showImages,\n      }\n    ),\n    hotelCardImage: 'w-full justify-center flex',\n    distanceClassName: cx('whitespace-nowrap text-xs font-normal text-text-alt', {\n      hidden: !!pageType?.isGlobal,\n    }),\n  };\n\n  const amexDisclaimer = disclaimerMessages?.find((disclaimer: RateInfoMessage) => {\n    return disclaimer?.type === 'amexDisclaimer';\n  })?.heading?.text;\n  const { recentlyViewed, setRecentlyViewed, showRecentlyViewedChip } = useRecentlyViewed(\n    ctyhocn as string\n  );\n\n  if (showRecentlyViewedChip) {\n    badges?.push('view');\n  }\n\n  const handleOnRateNameCTAClick = () => {\n    setRecentlyViewed({ ...recentlyViewed });\n    if (transactionPropertyData) metrics.setPriceClicked(transactionPropertyData);\n    if (badges?.includes('new')) sendReward(GOALS.newHotelRoomsPageLoad);\n  };\n  const setHighlightedMapCtyhocn = (ctyhocn: string | null) => {\n    dispatch({ type: 'SET_HIGHLIGHTED_MAP_CTYHOCN', payload: ctyhocn });\n  };\n  const getHotelLocationName = () => {\n    // In dream on a global page should display (city, state, Country) instead of distance marker\n    const address = hotelInfo?.address;\n    let location;\n    let srLocation;\n    if (pageType.isGlobal) {\n      // Hotel location name\n      location = address?.city;\n      if (address?.city) location = address.city;\n      if (address?.state) {\n        location += location ? `, ${address.state}` : address.state;\n      }\n      if (address?.country) {\n        location += location ? `, ${address.country}` : address.country;\n      }\n      //screen reader location text\n      if (address?.city) srLocation = address.city;\n      if (address?.stateName) {\n        srLocation += srLocation ? `, ${address.stateName}` : address.stateName;\n      }\n      if (address?.countryName) {\n        srLocation += srLocation ? `, ${address.countryName}` : address.countryName;\n      }\n    }\n    return { location, srLocation };\n  };\n  const { location, srLocation } = getHotelLocationName();\n\n  return (\n    <li\n      className=\"flex w-full justify-self-center rounded-lg border border-border\"\n      data-testid={`hotel-card-${ctyhocn}`}\n      onBlur={() => setHighlightedMapCtyhocn(ctyhocn || null)}\n      onFocus={() => setHighlightedMapCtyhocn(null)}\n      onMouseEnter={() => setHighlightedMapCtyhocn(ctyhocn || null)}\n      onMouseLeave={() => setHighlightedMapCtyhocn(null)}\n    >\n      <div className=\"flex w-full flex-col lg:max-w-[343px] xl:max-w-[440px]\">\n        {showImages && (\n          <div className={classname.hotelCardImage} data-testid=\"hotel-card-image\">\n            <div className=\"relative h-0 w-full overflow-hidden rounded-t-lg bg-bg-alt pb-2/3\">\n              <Carousel\n                data-testid=\"listViewImageCarousel\"\n                images={carouselImages ? carouselImages : [masterImage]}\n              />\n            </div>\n          </div>\n        )}\n        <HotelNameHeader url={hotelUrl} name={hotelName}>\n          <h3\n            className={cx('w-full break-words px-2.5 pt-2.5 font-semibold leading-snug', {\n              'text-sm': smMedViewPort,\n              'text-base': !smMedViewPort,\n            })}\n            data-testid=\"listViewPropertyName\"\n            id={`hotel-${ctyhocn}`}\n          >\n            {hotelName}\n          </h3>\n        </HotelNameHeader>\n        {badges?.length ? (\n          <div className=\"ps-2.5\">\n            <HotelBadges badges={badges} />\n          </div>\n        ) : null}\n\n        <div\n          className={classname.wrapperHotelCardHeaderAndCardContentClassName}\n          data-testid=\"wrapper-hotel-card-content\"\n        >\n          <div className={classname.hotelCardContentClassName} data-testid=\"hotel-card-content\">\n            <div className={classname.propertyNameClassName}>\n              <button\n                className={cx('btn-sm btn-primary-text block self-start font-semibold', {\n                  'btn-primary-link': isViewHotelDetailsTestVarB,\n                })}\n                data-testid={`hotelDetails-${ctyhocn}`}\n                onClick={onDetailsClick}\n                type=\"button\"\n              >\n                <span className={cx({ 'font-semibold': isViewHotelDetailsTestVarB })}>\n                  {isViewHotelDetailsTestVarB ? t('viewHotelDetails') : t('hotelDetails')}\n                </span>\n                <span className=\"sr-only\">&nbsp;{t('forHotel', { hotel: hotelName })}</span>\n                {isViewHotelDetailsTestVarB ? null : <span aria-hidden>&nbsp;&gt;</span>}\n              </button>\n              <span className={classname.distanceClassName} data-testid=\"distanceMarker\">\n                {distance}\n              </span>\n              <span className=\"sr-only\">{srLocation}</span>\n              <span\n                aria-hidden=\"true\"\n                className=\"whitespace-nowrap text-xs font-normal text-text-alt\"\n                data-testid=\"locationMarker\"\n              >\n                {location}\n              </span>\n              <TripAdvisorRating\n                isLoadingState={isTALoadingState}\n                showReviewCount={true}\n                tripAdvisorLocationSummary={tripAdvisorLocationSummary}\n              />\n            </div>\n            <div className={classname.rateNameClassName}>\n              <RateNameCTA\n                ctaHref={ctaHref || ''}\n                ctaLabel={ctaLabel}\n                ctaMessage={ctaMessage}\n                customRateInfo={customParams}\n                data-testid=\"priceInfo\"\n                isLoading={isHotelDataLoading}\n                rateMessages={rateInfo}\n                onRateNameCTAClick={handleOnRateNameCTAClick}\n              />\n            </div>\n          </div>\n          <KeyHotelAmenities amenities={amenities} />\n          {!!customParams?.showCompare ? <CompareHotelsCheckbox ctyhocn={ctyhocn || ''} /> : null}\n          {amexDisclaimer ? (\n            <div\n              className=\"shrink-0 grow-0 pt-2.5 text-xs font-normal flex-basis-full\"\n              data-testid=\"amexDisclaimerMsg\"\n            >\n              {amexDisclaimer}\n            </div>\n          ) : null}\n        </div>\n      </div>\n    </li>\n  );\n};\n\nexport default HotelCard;\n","export default function HotelCardCTASkeleton() {\n  return (\n    <div\n      aria-hidden\n      className=\"flex h-full flex-col items-end justify-end space-y-2 pt-2\"\n      data-testid=\"HotelCardCTASkeleton\"\n    >\n      <div className=\"h-8 w-16 animate-pulse bg-bg-alt\" />\n      <div className=\"h-4 w-1/2 animate-pulse bg-bg-alt\" />\n      <div className=\"h-10 w-32 animate-pulse rounded bg-bg-alt\" />\n    </div>\n  );\n}\n","import cx from 'classnames';\nimport HotelCardCTASkeleton from './hotel-card-cta-skeleton';\nimport { useMediaQuery } from 'usehooks-ts';\n\ntype HotelCardSkeletonProps = {\n  isListViewOnly?: boolean;\n  showImages?: boolean;\n};\n\nconst HotelCardSkeleton = ({ isListViewOnly, showImages }: HotelCardSkeletonProps) => {\n  const isDesktop = useMediaQuery('(min-width: 1024px)');\n\n  // Do not modify the classname string without notifying the team\n  const classname = {\n    wrapperHotelCardHeaderAndCardContentClassName: cx('w-full md:max-w-[440px]', {\n      'pl-0 py-2 md:pl-2 md:pr-2 pt-2 grow': showImages && !isDesktop,\n      ' md:min-w-[343px]': showImages && isDesktop,\n      'pt-2 sm:w-5/7 sm:pt-0 sm:pl-4 md:w-3/4': showImages && isListViewOnly,\n    }),\n    hotelCardImage: 'flex-shrink-0 w-full',\n  };\n\n  return (\n    <li\n      className={cx(\n        'flex w-full min-w-[343px] flex-col justify-self-center rounded-lg md:max-w-[440px]',\n        {\n          ' last:mb-4': !isDesktop,\n        }\n      )}\n      data-testid=\"hotel-card-skeleton\"\n    >\n      {/* Hotel Image placeholder */}\n      {showImages && (\n        <div className={classname.hotelCardImage} data-testid=\"hotel-card-image-shimmer\">\n          <div className=\"relative h-0 w-full animate-pulse overflow-hidden bg-bg-alt pb-2/3\" />\n        </div>\n      )}\n      {/* Hotel Card Details Wrapper */}\n      <div\n        className={classname.wrapperHotelCardHeaderAndCardContentClassName}\n        data-testid=\"wrapper-hotel-card-details-shimmer\"\n      >\n        {/* Hotel Header placeholder */}\n        <div\n          className=\"my-2 h-4 w-full animate-pulse bg-bg-alt leading-snug rtl:mr-2\"\n          data-testid=\"listView-property-name-shimmer\"\n        />\n        {/* Hotel Card Details Wrapper */}\n        <div className=\"flex\">\n          <div className=\"w-1/2 sm:w-full md:w-3/5 xl:grow  rtl:mr-2\">\n            {/* Hotel Details placeholder */}\n            <div\n              className=\"mb-2 block h-4 w-24 animate-pulse self-start bg-bg-alt\"\n              data-testid=\"hotel-details-button-shimmer\"\n            />\n            {/* Hotel Distance Marker placeholder */}\n            <div\n              className=\"h-4 w-16 animate-pulse whitespace-nowrap bg-bg-alt\"\n              data-testid=\"distance-marker-shimmer\"\n            />\n            {/* Trip Advisor placeholder */}\n            <div\n              className=\"mt-2 h-4 w-32 animate-pulse bg-bg-alt\"\n              data-testid=\"trip-advisor-rating-shimmer\"\n            />\n            {/* Trip Advisor Circle placeholder */}\n            <div\n              className=\"mt-2 h-4 w-20 animate-pulse bg-bg-alt\"\n              data-testid=\"trip-advisor-circle-review-shimmer\"\n            />\n            {/* Trip Advisor Based on Reviews placeholder */}\n            <div\n              className=\"mt-2 h-4 w-28 animate-pulse bg-bg-alt\"\n              data-testid=\"trip-advisor-reviews-shimmer\"\n            />\n          </div>\n          {/* Hotel Details CTA shimmer */}\n          <div className=\"flex w-1/2 shrink-0 justify-end overflow-hidden\">\n            <HotelCardCTASkeleton />\n          </div>\n        </div>\n      </div>\n    </li>\n  );\n};\n\nexport default HotelCardSkeleton;\n","import type { ShopMultiPropAvailQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { HotelType } from '../../../providers/app-provider/app-provider.types';\nimport { isBefore } from 'date-fns';\nimport { useEffect, useState } from 'react';\nimport { useWrappedRouter } from '../../../hooks';\n\nexport type WarningType =\n  | 'PastOpenDate'\n  | 'NoLeadRate'\n  | 'InvalidImageUrl'\n  | 'NoRequestedRate'\n  | 'MayBeAvailable';\nexport type WarningMsgs = {\n  [key in WarningType]?: string[];\n};\n\nexport const useHotelCardsLogWarningMessages = ({\n  hotels,\n  pricing,\n}: {\n  hotels?: HotelType[];\n  pricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>;\n}) => {\n  const { router } = useWrappedRouter();\n  const [hotelCardWarnings, setHotelCardWarnings] = useState<WarningMsgs>({});\n\n  const getWarningsForType = (prev?: string[], cur?: string[]) =>\n    Array.from(new Set([...(cur?.length ? cur : prev || [])]));\n\n  const updateWarnings = (warningMsgs: WarningMsgs) => {\n    setHotelCardWarnings((prev) => {\n      return {\n        ...prev,\n        ['PastOpenDate']: getWarningsForType(prev['PastOpenDate'], warningMsgs['PastOpenDate']),\n        ['NoLeadRate']: getWarningsForType(prev['NoLeadRate'], warningMsgs['NoLeadRate']),\n        ['InvalidImageUrl']: getWarningsForType(\n          prev['InvalidImageUrl'],\n          warningMsgs['InvalidImageUrl']\n        ),\n        ['NoRequestedRate']: getWarningsForType(\n          prev['NoRequestedRate'],\n          warningMsgs['NoRequestedRate']\n        ),\n        ['MayBeAvailable']: getWarningsForType(\n          prev['MayBeAvailable'],\n          warningMsgs['MayBeAvailable']\n        ),\n      };\n    });\n  };\n\n  const addHotelCardWarnings = () => {\n    const warningMsgs = hotels?.reduce((warning: WarningMsgs, hotel) => {\n      const ctyhocn = hotel?.ctyhocn;\n      if (ctyhocn) {\n        const openDate = hotel?.display?.openDate;\n        const isOpenDateInPast =\n          !hotel?.display?.open && openDate && isBefore(openDate, new Date());\n        if (isOpenDateInPast) {\n          warning.PastOpenDate\n            ? warning.PastOpenDate?.push(ctyhocn)\n            : (warning['PastOpenDate'] = [ctyhocn]);\n        }\n        const invalidUrl = hotel?.images?.carousel?.some((carousel) => !carousel?.ratios?.[0]?.url);\n        if (invalidUrl)\n          warning.InvalidImageUrl\n            ? warning.InvalidImageUrl?.push(ctyhocn)\n            : (warning['InvalidImageUrl'] = [ctyhocn]);\n        const noLeadRate = !router.asPath.includes('/search/') && !hotel?.leadRate;\n        if (noLeadRate)\n          warning.NoLeadRate\n            ? warning.NoLeadRate?.push(ctyhocn)\n            : (warning['NoLeadRate'] = [ctyhocn]);\n      }\n      return warning;\n    }, {});\n    if (warningMsgs) updateWarnings(warningMsgs);\n  };\n\n  const addHotelCardRateWarnings = () => {\n    if (pricing) {\n      const priceInfo = Object.values(pricing);\n      const warnings = priceInfo?.reduce((acc: WarningMsgs, cur) => {\n        if (cur.ctyhocn) {\n          if (cur.statusCode === 1740) {\n            acc?.NoRequestedRate\n              ? acc?.NoRequestedRate?.push(cur.ctyhocn)\n              : (acc['NoRequestedRate'] = [cur.ctyhocn]);\n          }\n          if (cur?.summary?.status?.type === 'MAY_BE_AVAILABLE') {\n            acc.MayBeAvailable\n              ? acc.MayBeAvailable?.push(cur.ctyhocn)\n              : (acc['MayBeAvailable'] = [cur.ctyhocn]);\n          }\n        }\n        return acc;\n      }, {});\n      if (warnings) updateWarnings(warnings);\n    }\n  };\n\n  useEffect(() => {\n    if (!hotels?.length) return;\n    addHotelCardWarnings();\n    addHotelCardRateWarnings();\n  }, [hotels, pricing]);\n\n  return {\n    invalidImageUrl: hotelCardWarnings?.InvalidImageUrl?.join(),\n    mayBeAvailable: hotelCardWarnings?.MayBeAvailable?.join(),\n    noLeadRate: hotelCardWarnings?.NoLeadRate?.join(),\n    noRequestedRate: hotelCardWarnings?.NoRequestedRate?.join(),\n    pastOpenDate: hotelCardWarnings?.PastOpenDate?.join(),\n  };\n};\n","import type { ShopMultiPropAvailQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { logWarning } from '@dx-ui/framework-logger';\nimport { useEffect } from 'react';\nimport { useHotelCardsLogWarningMessages } from './hooks/use-dynatrace-log-warnings';\n\nexport const LogHotelCardsWarningMessage = ({\n  hotels,\n  pricing,\n  initHotelCount,\n  isLoadingState,\n}: {\n  hotels?: HotelType[];\n  pricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>;\n  isLoadingState?: boolean;\n  initHotelCount?: number;\n}) => {\n  const { invalidImageUrl, noRequestedRate, pastOpenDate, noLeadRate, mayBeAvailable } =\n    useHotelCardsLogWarningMessages({\n      hotels,\n      pricing,\n    });\n\n  useEffect(() => {\n    if (pastOpenDate) {\n      logWarning('Shop_Search_UI-Hotel', `${pastOpenDate} has past open date`);\n    }\n  }, [pastOpenDate]);\n\n  useEffect(() => {\n    if (invalidImageUrl) {\n      logWarning('Shop_Search_UI-Hotel', `${invalidImageUrl} has invalid image url`);\n    }\n  }, [invalidImageUrl]);\n\n  useEffect(() => {\n    if (noLeadRate) {\n      logWarning(\n        'Shop_Search_UI-Hotel',\n        `${noLeadRate}  returned null lead rate, showing Sold out`,\n        'No lead Rate'\n      );\n    }\n  }, [noLeadRate]);\n\n  useEffect(() => {\n    if (noRequestedRate)\n      logWarning(\n        'Shop_Search_UI-MPA',\n        `${noRequestedRate} requested rate plans unavailable, statucode is 1740, showing Sold out`,\n        'Rate-rooms unavailable'\n      );\n    if (mayBeAvailable)\n      logWarning(\n        'Shop_Search_UI-MPA',\n        `${mayBeAvailable} returned MAY BE AVAILABLE`,\n        'MAY BE AVAILABLE'\n      );\n  }, [noRequestedRate, mayBeAvailable]);\n\n  useEffect(() => {\n    //Receiving a total count but no hotels available.\n    if (initHotelCount && initHotelCount > 0 && !isLoadingState && hotels?.length === 0) {\n      logWarning(\n        'Shop_Search_UI',\n        'Receiving a total count but no hotels available',\n        'No hotels available'\n      );\n    }\n  }, [hotels?.length, initHotelCount, isLoadingState]);\n\n  return null;\n};\n","import { forwardRef, useMemo } from 'react';\n\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { useTranslation } from 'next-i18next';\nimport type { GoogleCoordinate } from '../../utils';\nimport { getDistanceFromCenterFmt } from '../../utils';\nimport HotelCard from './hotel-card';\nimport HotelCardSkeleton from './hotel-card-skeleton';\nimport { useMetrics, useWrappedRouter } from '../../hooks';\n\nimport type { ShopMultiPropAvailQuery } from '@dx-ui/queries-dx-shop-search-ui';\nimport { useAppDispatch } from '../../providers/app-provider';\nimport {\n  DEFAULT_HOTEL_CARD_SKELETON_COUNT,\n  GOALS,\n  MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n} from '../../constants';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { LogHotelCardsWarningMessage } from './hotel-cards-warning-msg';\nimport { useGetViewHotelDetailsLinkMVT } from './hooks/use-view-hotel-details-link-mvt';\nimport { sendReward } from '@dx-ui/framework-conductrics';\n\nexport type IHotelCards = {\n  hotels: HotelType[];\n  pricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>;\n  showImages: boolean;\n  isListViewOnly?: boolean;\n  isLoadingState?: boolean;\n  centerCoordinate: GoogleCoordinate | null;\n  cardsClassName?: string;\n  initHotelCount?: number;\n} & React.HTMLAttributes<HTMLUListElement>;\n\nconst HotelCards = forwardRef<HTMLUListElement, IHotelCards>(\n  (\n    {\n      hotels,\n      pricing,\n      showImages,\n      isListViewOnly,\n      isLoadingState,\n      centerCoordinate,\n      cardsClassName,\n      initHotelCount,\n      ...rest\n    },\n    forwardedRef\n  ) => {\n    const { t } = useTranslation(['hotel-card', 'rate-name-cta', 'locations-page']);\n    const dispatch = useAppDispatch();\n    const metrics = useMetrics();\n    const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n    //NHCSEARCH-5793\n    const { isViewHotelDetailsTest } = useGetViewHotelDetailsLinkMVT();\n\n    //NHCSEARCH-5621\n\n    const handleDetailsClick = (ctyhocn: string, name: string, index: number) => {\n      //NHCSEARCH-5793\n      if (isViewHotelDetailsTest) {\n        sendReward(GOALS.hdpButtonClick);\n        sendReward(GOALS.hdpButtonClickTotal);\n      }\n      dispatch({ type: 'SET_PDP_CTYHOCN', payload: ctyhocn });\n      metrics.setBrandDetail({\n        ctyhocn,\n        view: 'List',\n        name,\n        index: index + 1,\n      });\n    };\n\n    const skeletonCardCount = useMemo(() => {\n      if (initHotelCount && initHotelCount > 0) {\n        return initHotelCount && initHotelCount > MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n          ? MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n          : initHotelCount;\n      }\n      return DEFAULT_HOTEL_CARD_SKELETON_COUNT;\n    }, [initHotelCount]);\n    if (isLoadingState) {\n      let cnt = 0;\n      return (\n        <ul ref={forwardedRef} {...rest} className={cardsClassName}>\n          {Array.from({ length: skeletonCardCount }, () => (\n            <HotelCardSkeleton\n              key={cnt++}\n              isListViewOnly={isListViewOnly}\n              showImages={showImages}\n            />\n          ))}\n        </ul>\n      );\n    }\n    const keyString: string | undefined =\n      Object.keys(rest).find((key) => key === 'data-testid') ?? '';\n\n    const SoldOutInfoMessageBanner = () => {\n      /* show property sold out info banner if specific searched property sold out */\n      const hotelPlaceId = queryParameters?.placeId?.includes('dx-hotel')\n        ? queryParameters?.placeId?.split('::')[1]?.toUpperCase()\n        : null;\n      const queryParam = queryParameters?.query?.toUpperCase();\n      return (hotelPlaceId && pricing?.[hotelPlaceId]?.statusCode === 1740) ||\n        (queryParam && pricing?.[queryParam]?.statusCode === 1740) ? (\n        <InfoMessageBanner message={t('selectedHotelSoldOut')} />\n      ) : null;\n    };\n    if (!hotels.length) return null;\n\n    return (\n      <>\n        <LogHotelCardsWarningMessage\n          initHotelCount={initHotelCount}\n          isLoadingState={isLoadingState}\n          hotels={hotels}\n          pricing={pricing}\n        />\n        <SoldOutInfoMessageBanner />\n        <ul\n          key={`ulHotelCard-${keyString}`}\n          ref={forwardedRef}\n          {...rest}\n          className={cardsClassName}\n        >\n          {hotels.map((hotel, _id) => {\n            const { name, ctyhocn, localization } = hotel;\n            const { distanceFmt } = getDistanceFromCenterFmt(\n              t,\n              centerCoordinate,\n              localization?.coordinate,\n              router.locale\n            );\n            const priceInfo = pricing && pricing[ctyhocn];\n\n            return (\n              <HotelCard\n                key={`hotel-card-${ctyhocn}`}\n                distance={distanceFmt}\n                isTALoadingState={isLoadingState}\n                isListViewOnly={isListViewOnly}\n                onDetailsClick={() => handleDetailsClick(ctyhocn, name || '', _id)}\n                showImages={showImages}\n                priceInfo={priceInfo}\n                hotelInfo={hotel}\n              />\n            );\n          })}\n        </ul>\n      </>\n    );\n  }\n);\n\nHotelCards.displayName = 'HotelCards';\n\nexport default HotelCards;\n","import { Pagination } from '@dx-ui/osc-pagination';\nimport { useRef, useState, useEffect, useMemo } from 'react';\nimport { useTranslation } from 'next-i18next';\n\nimport { useMetrics, useTrackSearchPricing, useWrappedRouter, useBrandDetails } from '../../hooks';\nimport type { HotelType } from '../../providers/app-provider/app-provider.types';\nimport { ListViewBrandBanner } from './list-view-brand-banner';\nimport {\n  DEFAULT_HOTEL_CARD_SKELETON_COUNT,\n  MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n  env,\n} from '../../constants';\nimport { AgeBasedModal } from '../../components/age-based-modal';\nimport type { GoogleCoordinate } from '../../utils';\nimport { getLengthOfStay } from '../../utils';\nimport { setFocusOnFirstListViewCard } from './list-view-utils/list-view.utils';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { useConfigRule } from '@dx-ui/framework-config-rule-provider';\nimport useShopMultiPropAvail from '../../hooks/use-shop-multi-prop-avail/use-shop-multi-prop-avail';\nimport { getInfoBannerURLWithBrandRemoved } from './list-view-utils/list-view-brand-banner.utils';\nimport { useGetVisibleInBoundHotels } from '../../hooks/use-get-visible-in-bound-hotels';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { Link } from '@dx-ui/osc-link';\nimport HotelCards from '../hotel-card/hotel-cards';\nimport HotelCardSkeleton from '../hotel-card/hotel-card-skeleton';\nimport cx from 'classnames';\n\ntype ListViewProps = {\n  isConductricsLoaded?: boolean;\n  brandName?: string;\n  brandCode?: string;\n  centerCoordinate: GoogleCoordinate | null;\n  isHSODataLoading?: boolean;\n  onPageChanged?: (paginationIndex: number, pageSize: number) => void;\n  sortedHotels: HotelType[];\n  initHotelCount?: number;\n};\ntype IListViewLoadingShimmer = {\n  isListViewOnly?: boolean;\n  showImages?: boolean;\n  cardsClassName?: string;\n  cardCount?: number;\n};\n\n/*\n * List View Loading / Shimmer\n * Displays if hotel data is being fetched from backend\n */\nconst ListViewLoadingShimmer = ({\n  isListViewOnly,\n  showImages,\n  cardsClassName,\n  cardCount = DEFAULT_HOTEL_CARD_SKELETON_COUNT,\n}: IListViewLoadingShimmer) => {\n  let cnt = 0;\n  return (\n    <ul className={cx(cardsClassName)}>\n      {Array.from({ length: cardCount }, () => (\n        <HotelCardSkeleton key={cnt++} isListViewOnly={isListViewOnly} showImages={showImages} />\n      ))}\n    </ul>\n  );\n};\n\nexport const ListView = ({\n  isConductricsLoaded,\n  brandName,\n  brandCode,\n  centerCoordinate,\n  isHSODataLoading,\n  onPageChanged,\n  sortedHotels,\n  initHotelCount,\n}: ListViewProps) => {\n  const {\n    hasConnectingRooms,\n    showHotelImages,\n    paginationIndex,\n    selectedCurrency,\n    pageType,\n    isListVisible,\n  } = useAppState();\n  const listRef = useRef<HTMLUListElement | null>(null);\n  const { t } = useTranslation(['locations-page', 'list-view', 'list-view-brand-banner']);\n  const metrics = useMetrics();\n  const dispatch = useAppDispatch();\n\n  const [isAgeBasedModalOpen, setIsAgeBasedModalOpen] = useState(false);\n  const ulContainerRef = useRef<HTMLDivElement | null>(null);\n\n  const { taggedConfig } = useConfigRule();\n  // if show hotel images toggle is disabled always show images. Otherwise show images depending on toggle state\n  const showImages = !taggedConfig?.config.showListViewHotelImagesToggle || !!showHotelImages;\n  const isListViewOnly = !taggedConfig?.config['showMap'];\n\n  const {\n    safeQueryParams: queryParameters,\n    router: { asPath, locale },\n  } = useWrappedRouter();\n  const { canonicalSlug, altSlugs, isHotelBrand } = useBrandDetails({ brandCode });\n\n  const currentPageVisibleHotels = sortedHotels.slice(\n    paginationIndex * MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n    (paginationIndex + 1) * MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n  );\n  const totalPages = Math.ceil(sortedHotels.length / MAX_PROPERTIES_PER_LIST_VIEW_PAGE);\n\n  //guarantee we always fetch hotels in list view even if >150. Disable query if on locations page\n  const { hashedData: pricing } = useShopMultiPropAvail({\n    ctyhocns: currentPageVisibleHotels.map((hotel) => hotel.ctyhocn),\n    mpaConstraints: true,\n  });\n\n  const showAmountAfterTax = useMemo(() => {\n    return asPath.includes('/locations/')\n      ? sortedHotels?.some((hotel) => !!hotel?.leadRate?.lowest?.cmaTotalPriceIndicator)\n      : sortedHotels.some((hotel) =>\n          Boolean(pricing[hotel.ctyhocn]?.summary?.lowest?.cmaTotalPriceIndicator)\n        );\n  }, [asPath, pricing, sortedHotels]);\n\n  useTrackSearchPricing({\n    isDateSearch: true,\n    hotels: currentPageVisibleHotels,\n    pricing,\n    datesFlex: queryParameters?.datesFlex,\n    selectedCurrency: selectedCurrency || '',\n    lengthOfStay: getLengthOfStay(queryParameters?.departureDate, queryParameters?.arrivalDate),\n  });\n\n  const { brandedVisibleHotels, otherVisibleHotels } = useGetVisibleInBoundHotels({\n    currentPageVisibleHotels,\n    brandCode,\n    brandName,\n  });\n\n  const shouldDisplayBrandBannerInCurrentPage = () => {\n    const atLeastOneHotelNotBranded = otherVisibleHotels?.length > 0;\n    const displayAtEndOfBrandPageResults = pageType.isBrand && paginationIndex === totalPages - 1;\n\n    switch (true) {\n      case displayAtEndOfBrandPageResults:\n        return true;\n      case pageType.isGlobal && atLeastOneHotelNotBranded:\n        return true;\n      default:\n        return false;\n    }\n  };\n  //call onPageChange if it exists and reset focus on first card if paginationIndex changes\n  useEffect(() => {\n    if (onPageChanged) onPageChanged(paginationIndex, MAX_PROPERTIES_PER_LIST_VIEW_PAGE);\n  }, [onPageChanged, paginationIndex]);\n\n  //reset focus on first card in list any time pagination changes\n  useEffect(() => {\n    if (paginationIndex > 0) setFocusOnFirstListViewCard(ulContainerRef);\n  }, [paginationIndex]);\n\n  const handlePagination = async (newPageIndex: number) => {\n    dispatch({ type: 'SET_PAGINATION_INDEX', payload: newPageIndex });\n    await metrics.trackPaginationClick({\n      paginationNumber: `${newPageIndex + 1}`,\n      actionType: !queryParameters ? 'categoryPagination' : 'searchAction',\n    });\n  };\n  useEffect(() => {\n    // setting setPaginationData separately for each flow (search & locations)\n    // since search hotels will not load till conductrics is resolved\n    if (isConductricsLoaded && totalPages > 0) {\n      // due to string character limit constraints with Adobe,\n      // we still want only first page results in the propertyResultList.\n      // but propertyResults should reflect the total number of hotels returned.\n      metrics.setPaginationData({\n        totalPages: `${totalPages}`,\n        propertyResultList: otherVisibleHotels.map((hotel) => hotel.ctyhocn).join(','),\n        propertyResults: otherVisibleHotels.length,\n        brandedHotels: brandedVisibleHotels\n          .filter((hotel) => hotel.brandCode === brandCode)\n          .map((hotel) => hotel.ctyhocn),\n      });\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [isConductricsLoaded]);\n\n  // if the current page is beyond the last page, set it to the last page\n  const lastPageIndex = Math.max(totalPages - 1, 0); // go no lower than the first page\n  if (paginationIndex > lastPageIndex && dispatch) {\n    dispatch({ type: 'SET_PAGINATION_INDEX', payload: lastPageIndex });\n  }\n  const showHotelCardImage = !!pageType.isDreams || !!showImages;\n  const classname = {\n    cardsClassName:\n      'mb-4 grid justify-center gap-2 grid-cols-1 lg:grid-cols-2 lg:w-[694px] xl:w-[888px]',\n  };\n  const linkWithoutBrandSlug = pageType.isBrand ? (\n    <Link\n      url={getInfoBannerURLWithBrandRemoved({\n        baseUrl: env.OHW_BASE_URL,\n        path: asPath,\n        locale,\n        canonicalSlug,\n        altSlugs,\n        brandCode,\n      })}\n      className=\"px-2 text-sm font-normal\"\n    >\n      {t('list-view-brand-banner:exploreOtherHotelsLink')}\n    </Link>\n  ) : null;\n\n  const skeletonCardCount = useMemo(() => {\n    if (initHotelCount && initHotelCount > 0) {\n      return initHotelCount && initHotelCount > MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n        ? MAX_PROPERTIES_PER_LIST_VIEW_PAGE\n        : initHotelCount;\n    }\n    return DEFAULT_HOTEL_CARD_SKELETON_COUNT;\n  }, [initHotelCount]);\n\n  if (isHSODataLoading && sortedHotels?.length === 0)\n    return (\n      <ListViewLoadingShimmer\n        isListViewOnly={isListViewOnly}\n        showImages={showHotelCardImage}\n        cardsClassName={classname.cardsClassName}\n        cardCount={skeletonCardCount}\n      />\n    );\n\n  // Returns Message when zero hotels are found to adjust search / map\n  if (!isHSODataLoading && sortedHotels?.length === 0) {\n    const noHotelsFoundBannerMessage = isHotelBrand\n      ? t('list-view-brand-banner:couldNotFindHotelsInSearchArea', { brandName })\n      : t('notFoundMessage');\n    return (\n      <InfoMessageBanner message={noHotelsFoundBannerMessage}>\n        {linkWithoutBrandSlug}\n      </InfoMessageBanner>\n    );\n  }\n\n  return (\n    <div ref={ulContainerRef} className={cx({ hidden: !isListVisible })}>\n      {showAmountAfterTax ? <p className=\"block pb-2 \">{t('list-view:cmaPriceMessage')}</p> : null}\n      {hasConnectingRooms && <InfoMessageBanner message={t('list-view:ccrPricingMessage')} />}\n      {/* Child based pricing modal when at least one property in map requires child ages but arent specified by customer. but TBD about this location in code (at least no longer in hotel card)*/}\n      <AgeBasedModal\n        isAgeBasedModalOpen={isAgeBasedModalOpen}\n        pricing={pricing}\n        setIsAgeBasedModalOpen={setIsAgeBasedModalOpen}\n      />\n      <HotelCards\n        aria-label={t('list-view:hotelSearchResults')}\n        centerCoordinate={centerCoordinate}\n        data-testid=\"hotelsList\"\n        hotels={currentPageVisibleHotels || []}\n        isListViewOnly={isListViewOnly}\n        isLoadingState={isHSODataLoading}\n        pricing={pricing}\n        ref={listRef}\n        showImages={showHotelCardImage}\n        cardsClassName={classname.cardsClassName}\n        initHotelCount={initHotelCount}\n      />\n      <ListViewBrandBanner\n        brandCode={brandCode}\n        isDisplayBrandBanner={shouldDisplayBrandBannerInCurrentPage()}\n        isPageBrandFilterEnabled={pageType.isPageBrandFilterEnabled}\n        numBrandedHotels={brandedVisibleHotels?.length}\n        isEndOfResults={!isHSODataLoading && paginationIndex === lastPageIndex}\n      />\n\n      <div className=\"border-y border-border py-4\">\n        <Pagination\n          current={paginationIndex}\n          onNextClick={() => handlePagination(paginationIndex + 1)}\n          onPreviousClick={() => handlePagination(paginationIndex - 1)}\n          total={totalPages}\n        />\n      </div>\n    </div>\n  );\n};\n","import type * as React from 'react';\nimport { useMetrics, useWrappedRouter } from '../../hooks';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport {\n  CurrencyConverter as OSCCurrencyConverter,\n  convert,\n  useCurrencyConversion,\n} from '@dx-ui/osc-currency-converter';\nimport { useFilterState } from '../../providers/filter-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\n\ntype CurrencyConverterProps = {\n  onChange?: () => void;\n};\n\nexport const CurrencyConverter = ({ onChange }: CurrencyConverterProps) => {\n  const metrics = useMetrics();\n  const { router } = useWrappedRouter();\n  const dispatch = useAppDispatch();\n  const { selectedCurrency: currencyCode, pageType, selectedCurrency } = useAppState();\n  const activeFiltersState = useFilterState();\n\n  const { currenciesMap } = useCurrencyConversion();\n  async function handleChange(event: React.ChangeEvent<HTMLSelectElement>) {\n    const currency = event.target.value;\n\n    const fromCurrency = currenciesMap?.get(selectedCurrency || 'USD');\n    const toCurrency = currenciesMap?.get(currency || 'USD');\n    if (!fromCurrency || !toCurrency) {\n      return;\n    }\n    sendReward(GOALS.currencyEngagement);\n    const converted = convert(\n      activeFiltersState?.priceFilter?.[1],\n      fromCurrency,\n      toCurrency,\n      0,\n      ''\n    );\n    dispatch({\n      type: 'SET_DISPLAY_CURRENCY',\n      payload: {\n        currency,\n        ...(activeFiltersState?.priceFilter &&\n          converted.price && {\n            priceFilter: [activeFiltersState?.priceFilter?.[0], converted.price],\n          }),\n      },\n    });\n    onChange?.();\n    await metrics.trackCurrencyConverterClick({ currencyCode: currency || 'LOCAL' });\n  }\n\n  const selectProps = {\n    id: 'selectCurrencyConverter',\n    'data-testid': 'currencyConverterSelect',\n  };\n\n  if (pageType.isPointsExplorer) return null;\n\n  return (\n    <div className=\"w-36 items-center pl-2 text-sm md:w-64 rtl:pl-0 rtl:pr-2\">\n      <OSCCurrencyConverter\n        showDefaultOption={true}\n        language={router.locale as string}\n        onChange={handleChange}\n        selectedCurrency={currencyCode as string}\n        hasStackedDisplay={true}\n        selectProps={selectProps}\n      />\n    </div>\n  );\n};\n","type GetAspectRatioUrlParams = {\n  /** Aspect ratio based URL from CMS */\n  src?: string | null;\n  /** Carousel container width */\n  width: number;\n};\n\nconst BREAK_POINTS = Object.freeze({\n  small: 640,\n  medium: 768,\n  large: 1024,\n  extraLarge: 1280,\n  twoExtraLarge: 1440,\n});\n\nexport type BreakPoints = keyof typeof BREAK_POINTS;\n\n/**\n * Returns a set of aspect ratio based URLs (with 2x and 3x options) bucketed by breakpoints\n * @param src Aspect ratio based URL from CMS\n * @param width desired image width\n * @returns imgUrl, twoXimgUrl, threeXImgUrl\n */\nexport const getAspectRatioUrl = ({ src, width }: GetAspectRatioUrlParams) => {\n  if (!src) return { imgUrl: null, twoXimgUrl: null, threeXImgUrl: null };\n\n  const srcUrl = new URLSearchParams(src);\n\n  const cw = srcUrl.has('cw') ? parseInt(srcUrl.get('cw') as string) : null;\n  const ch = srcUrl.has('ch') ? parseInt(srcUrl.get('ch') as string) : null;\n\n  // If a crop width or height is not present in the URL, return null as we cant do the math to return the appopriate img src. Contact the CMS team in case we see broken assets\n  if (!cw || !ch) return { imgUrl: null, twoXimgUrl: null, threeXImgUrl: null };\n\n  const aspectRatioVariants = Object.entries(BREAK_POINTS).reduce(\n    (accum, [breakPointName, breakPointWidth]) => {\n      const imgUrl = `${src}&rw=${breakPointWidth}&rh=${Math.round((breakPointWidth * ch) / cw)}`;\n\n      const twoXimgUrl = `${src}&rw=${breakPointWidth * 2}&rh=${\n        Math.round((breakPointWidth * ch) / cw) * 2\n      }`;\n\n      const threeXImgUrl = `${src}&rw=${breakPointWidth * 3}&rh=${\n        Math.round((breakPointWidth * ch) / cw) * 3\n      }`;\n\n      return { ...accum, [breakPointName]: { imgUrl, twoXimgUrl, threeXImgUrl } };\n    },\n    {} as Record<BreakPoints, { imgUrl: string; twoXimgUrl: string; threeXImgUrl: string }>\n  );\n\n  switch (true) {\n    case width <= BREAK_POINTS.small:\n      return aspectRatioVariants.small;\n\n    case width > BREAK_POINTS.small && width <= BREAK_POINTS.medium:\n      return aspectRatioVariants.medium;\n\n    case width > BREAK_POINTS.medium && width <= BREAK_POINTS.large:\n      return aspectRatioVariants.large;\n\n    case width > BREAK_POINTS.large && width <= BREAK_POINTS.extraLarge:\n      return aspectRatioVariants.extraLarge;\n\n    default:\n      return aspectRatioVariants.twoExtraLarge;\n  }\n};\n","export * from './lib/get-aspect-ratio-url';\n","import type { IconNames } from '@dx-ui/osc-icon';\nimport Icon from '@dx-ui/osc-icon';\nimport cx from 'classnames';\n\nexport const InfoMessageBanner = ({\n  bannerClassName,\n  message,\n  children,\n  shouldCenterInfoIcon,\n  iconClassName,\n  iconName = 'info-circle',\n}: {\n  message?: string;\n  children?: React.ReactNode;\n  shouldCenterInfoIcon?: boolean;\n  bannerClassName?: string;\n  iconClassName?: string;\n  iconName?: (typeof IconNames)[number];\n}) => (\n  <h2\n    className={cx(\n      'mb-4 flex px-4 py-3 font-semibold leading-none',\n      {\n        'bg-bg-primary': !bannerClassName,\n      },\n      bannerClassName\n    )}\n  >\n    <div className={cx({ 'flex items-center': shouldCenterInfoIcon })}>\n      <Icon name={iconName} variant=\"regular\" size=\"sm\" className={iconClassName} />\n    </div>\n    <div className=\"flex flex-col\">\n      <span className=\"pl-2 text-base\">{message}</span>\n      {children}\n    </div>\n  </h2>\n);\n","import {\n  NUM_AMENITIES_SUGGESTIONS_WANTED,\n  HotelAttributeIds,\n  MAX_SUGGESTED_AMENITY_FILTERS_WITH_SALE_FILTER,\n} from '../components/filters/filter.constants';\nimport type { AmenityItem } from '../components/filters/suggested-filters';\nimport type { HotelAmenityId } from '@dx-ui/queries-dx-shop-search-ui';\nimport { useAppState } from '../providers/app-provider';\nimport type { HotelType } from '../providers/app-provider/app-provider.types';\nimport { useMemo } from 'react';\nimport { useFeatureToggleConfig } from './use-feature-toggle';\nimport type { Maybe } from '@dx-ui/gql-types';\nimport { useTranslation } from 'next-i18next';\n\nconst findAmenity = (wantedAmenityId: string, amenities: AmenityItem[]) => {\n  const foundAmenity = amenities.find((amenity) => amenity.id === wantedAmenityId);\n  return (\n    foundAmenity || {\n      id: wantedAmenityId,\n      name: wantedAmenityId,\n    }\n  );\n};\n\nconst calculateSuggestedFilterCounts = ({\n  filtersList,\n  visibleHotels,\n  hotelsInBounds,\n}: {\n  filtersList?: string[];\n  visibleHotels: string[];\n  hotelsInBounds: Record<string, HotelType>;\n}) => {\n  return filtersList?.length\n    ? filtersList.reduce<{\n        isAtleastOneSuggestedFilter: boolean;\n        suggestedFilterCounts: { [key: string]: number };\n      }>(\n        (result, suggestedFilter) => {\n          const count = visibleHotels.reduce((count, hotel) => {\n            const inBoundsHotel = hotelsInBounds[hotel];\n            if (inBoundsHotel) {\n              return inBoundsHotel.amenityIds.includes(suggestedFilter as HotelAmenityId)\n                ? count + 1\n                : count;\n            }\n            return count;\n          }, 0);\n\n          return {\n            isAtleastOneSuggestedFilter: result.isAtleastOneSuggestedFilter || count > 0,\n            suggestedFilterCounts: {\n              ...result.suggestedFilterCounts,\n              [suggestedFilter]: count,\n            },\n          };\n        },\n        {\n          isAtleastOneSuggestedFilter: false,\n          suggestedFilterCounts: {},\n        }\n      )\n    : {\n        isAtleastOneSuggestedFilter: false,\n        suggestedFilterCounts: {},\n      };\n};\n\nconst calculateTopSuggestedFilters = (\n  suggestedFilterCounts: { [key: string]: number },\n  amenities: AmenityItem[],\n  maxSuggestedFilters: number\n) => {\n  const topSuggestedFilters: { [key: string]: AmenityItem } = {};\n\n  for (const suggestedFilter of Object.keys(suggestedFilterCounts)) {\n    const count = suggestedFilterCounts[suggestedFilter] ?? 0;\n\n    if (count > 0 && Object.keys(topSuggestedFilters)?.length < maxSuggestedFilters) {\n      topSuggestedFilters[suggestedFilter] = findAmenity(suggestedFilter, amenities);\n      const topFilter = topSuggestedFilters[suggestedFilter];\n      if (topFilter) topFilter.count = suggestedFilterCounts[suggestedFilter];\n    } else if (count > 0) {\n      const smallestCountKey = Object.keys(topSuggestedFilters).reduce((a, b) => {\n        const filterA = topSuggestedFilters[a];\n        const filterB = topSuggestedFilters[b];\n        if (filterA && filterB) {\n          const aCount = filterA.count || 0;\n          const bCount = filterB.count || 0;\n          return aCount < bCount ? a : b;\n        }\n        return a;\n      });\n\n      const smallestCount = topSuggestedFilters[smallestCountKey]?.count;\n\n      if (!smallestCount || count > smallestCount) {\n        delete topSuggestedFilters[smallestCountKey];\n        topSuggestedFilters[suggestedFilter] = findAmenity(suggestedFilter, amenities);\n        const topSuggestedFilter = topSuggestedFilters[suggestedFilter];\n        if (topSuggestedFilter) topSuggestedFilter.count = suggestedFilterCounts[suggestedFilter];\n      }\n    }\n  }\n  return topSuggestedFilters;\n};\n\nconst getSuggestedFiltersQuant = ({ hasSalesFilter }: { hasSalesFilter: boolean }) => {\n  if (hasSalesFilter) {\n    return MAX_SUGGESTED_AMENITY_FILTERS_WITH_SALE_FILTER;\n  } else {\n    return NUM_AMENITIES_SUGGESTIONS_WANTED;\n  }\n};\n\nexport const useSuggestedFilters = ({\n  visibleHotels,\n  amenities,\n  matchId,\n  saleFilter,\n}: {\n  visibleHotels: string[];\n  amenities: AmenityItem[];\n  matchId?: Maybe<string>;\n  saleFilter?: { showSaleFilter: boolean; saleFilterCount: number };\n}) => {\n  const { hotelsInBounds } = useAppState();\n  const { t } = useTranslation('filters');\n\n  const { config: defaultConfig, configFromRule } = useFeatureToggleConfig(\n    'config-rule-search-ui-suggested-filters',\n    { matchId: matchId || '' }\n  );\n\n  const suggestedSaleFilter = useMemo(\n    () =>\n      saleFilter?.showSaleFilter && visibleHotels.length <= 150\n        ? {\n            sale: {\n              id: HotelAttributeIds.sale,\n              name: t('saleRates'),\n              count: saleFilter?.saleFilterCount,\n            },\n          }\n        : null,\n    [saleFilter?.saleFilterCount, saleFilter?.showSaleFilter, t, visibleHotels.length]\n  );\n\n  const filtersList = (configFromRule || defaultConfig)?.suggestedFilters;\n\n  const maxSuggestedFilters = getSuggestedFiltersQuant({\n    hasSalesFilter: Boolean(suggestedSaleFilter),\n  });\n\n  // get the count of all filters in filtersList\n  const { isAtleastOneSuggestedFilter, suggestedFilterCounts } = useMemo(\n    () => calculateSuggestedFilterCounts({ filtersList, visibleHotels, hotelsInBounds }),\n    [filtersList, hotelsInBounds, visibleHotels]\n  );\n  // get only the top filters count while maintaining the order of filtersList\n  const suggestedFilters = useMemo(\n    () => calculateTopSuggestedFilters(suggestedFilterCounts, amenities, maxSuggestedFilters),\n\n    [suggestedFilterCounts, amenities, maxSuggestedFilters]\n  );\n\n  const topSuggestedFilters = suggestedSaleFilter\n    ? {\n        ...suggestedSaleFilter,\n        ...suggestedFilters,\n      }\n    : suggestedFilters;\n\n  return { topSuggestedFilters, isAtleastOneSuggestedFilter };\n};\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useFilterState } from '../../providers/filter-provider';\nimport type { HotelAmenityId, Maybe } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { ActiveFiltersState } from './filter.constants';\nimport { useMetrics } from '../../hooks';\nimport { GOALS } from '../../constants';\nimport { useSuggestedFilters } from '../../hooks/use-suggested-filters';\nimport Icon, { AmenityIcons } from '@dx-ui/osc-icon';\nimport { HotelAttributeIds } from './filter.constants';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { TaxonomyList } from '@dx-ui/osc-taxonomy-list';\nimport { useState } from 'react';\nimport { useVerticalSpaceMVT } from '../../hooks/use-vertical-space-MVT';\n\nexport type AmenityItem = {\n  id: string;\n  name: string;\n  hint?: string | null;\n  count?: number;\n};\ntype SuggestedFilterButtonsProps = {\n  amenities?: AmenityItem[];\n  isConductricsLoaded?: boolean;\n  isFindingHotels?: boolean;\n  onFilterCriteriaChange: (activeFiltersState: ActiveFiltersState) => void;\n  visibleHotels: string[];\n  matchId?: Maybe<string>;\n  saleFilter?: { showSaleFilter: boolean; saleFilterCount: number };\n};\n\ntype SuggestedFiltersAmenitiesProps = {\n  suggestedFilterOrderedList: AmenityItem[];\n  onFilterCriteriaChange: (activeFiltersState: ActiveFiltersState) => void;\n  showSaleFilter?: boolean;\n  suggestedFilterMVTVariant?: Record<string, boolean>;\n};\n\n/*\n * SuggestedFilterButtons\n * Displays the Suggested Filter Component\n */\nexport const SuggestedFilterButtons = ({\n  amenities = [],\n  isConductricsLoaded,\n  isFindingHotels,\n  onFilterCriteriaChange,\n  visibleHotels,\n  matchId,\n  saleFilter,\n}: SuggestedFilterButtonsProps) => {\n  const { isAtleastOneSuggestedFilter, topSuggestedFilters } = useSuggestedFilters({\n    visibleHotels,\n    amenities,\n    matchId,\n    saleFilter,\n  });\n  const suggestedFiltersOrderedList = Object.values(topSuggestedFilters);\n\n  const showSuggestedFilters = isAtleastOneSuggestedFilter || saleFilter?.showSaleFilter;\n\n  const { isSuggestedFiltersInHorizontalScroll } = useVerticalSpaceMVT();\n\n  if (showSuggestedFilters) {\n    if (isFindingHotels || !isConductricsLoaded || !amenities.length)\n      return <SuggestedFiltersShimmer shouldShowTitle={!isSuggestedFiltersInHorizontalScroll} />;\n    else if (isConductricsLoaded && !!visibleHotels.length)\n      return (\n        <>\n          {isSuggestedFiltersInHorizontalScroll ? null : <SuggestedFiltersTitle />}\n          <SuggestedFiltersAmenities\n            onFilterCriteriaChange={onFilterCriteriaChange}\n            suggestedFilterOrderedList={suggestedFiltersOrderedList}\n            showSaleFilter={saleFilter?.showSaleFilter}\n          />\n        </>\n      );\n  }\n  return null;\n};\n\n/*\n * SuggestedFiltersShimmer\n * Returns the Suggested Filters Shimmer State\n */\nconst SuggestedFiltersShimmer = ({ shouldShowTitle }: { shouldShowTitle?: boolean }) => (\n  <>\n    {shouldShowTitle ? (\n      <div className=\"flex\" data-testid=\"suggested-filters-shimmer\">\n        <div className=\"mb-4 h-6 w-32 animate-pulse bg-bg-alt\" />\n      </div>\n    ) : null}\n    <div\n      className={cx('flex h-32 gap-2 lg:h-16', {\n        '-mb-3 pt-3.5': !shouldShowTitle,\n      })}\n    >\n      <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n      <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n      <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n      <div className=\"mr-2 h-10 w-20 animate-pulse rounded-full bg-bg-alt lg:mr-1 lg:w-36\" />\n    </div>\n  </>\n);\n\n/*\n * Returns Suggest Filters Title\n */\nconst SuggestedFiltersTitle = () => {\n  const { t } = useTranslation('filters');\n  return (\n    <h2 className=\"label mr-1 flex items-start pb-1 font-semibold tracking-tight rtl:mx-0\">\n      {t('suggestedFiltersLabel')}\n    </h2>\n  );\n};\n\nconst SuggestedFiltersAmenities = ({\n  onFilterCriteriaChange,\n  suggestedFilterOrderedList,\n}: SuggestedFiltersAmenitiesProps) => {\n  const { t } = useTranslation('filters');\n  const activeFiltersState = useFilterState();\n\n  /* NHCSEARCH-5451 Vertical Space MVT */\n  const { isShorterSuggestedFilters, isSuggestedFiltersInHorizontalScroll } = useVerticalSpaceMVT();\n\n  const getTaxonomyListClassName = () => {\n    switch (true) {\n      case isShorterSuggestedFilters:\n        return '-mb-3';\n      case isSuggestedFiltersInHorizontalScroll:\n        return '-mb-3 pt-3.5';\n      default:\n        return undefined;\n    }\n  };\n  return (\n    <div className=\"pb-2\">\n      <TaxonomyList\n        labelledBy=\"suggestedFilters\"\n        testId=\"suggested-filters\"\n        name={t('suggestedFiltersLabel')}\n        listItemClassname={getTaxonomyListClassName()}\n      >\n        {suggestedFilterOrderedList?.map((amenity) => {\n          const amenityListCount = amenity?.count;\n          const amenitySelected =\n            activeFiltersState.amenityFilters.includes(amenity?.id ?? '') ||\n            activeFiltersState.attributeFilters.includes(amenity?.id);\n          return amenityListCount ? (\n            <SuggestedFilterButton\n              amenity={amenity}\n              amenityListCount={amenityListCount}\n              isAmenitySelected={amenitySelected}\n              onFilterCriteriaChange={onFilterCriteriaChange}\n            />\n          ) : null;\n        })}\n      </TaxonomyList>\n      <span aria-hidden=\"true\" className=\"sr-only\" id=\"suggestedFilters\">\n        {t('suggestedFiltersLabel')}\n      </span>\n    </div>\n  );\n};\nfunction SuggestedFilterButton({\n  amenity,\n  amenityListCount,\n  isAmenitySelected,\n  onFilterCriteriaChange,\n}: {\n  amenity: AmenityItem;\n  amenityListCount: number;\n  isAmenitySelected: boolean;\n  onFilterCriteriaChange: (activeFiltersState: ActiveFiltersState) => void;\n}) {\n  const [a11yText, setA11yText] = useState<string>('');\n  const [selectedAmenity, setSelectedAmenity] = useState('');\n  const { t } = useTranslation('filters');\n  const activeFiltersState = useFilterState();\n  const metrics = useMetrics();\n\n  /* NHCSEARCH-5451 Vertical Space MVT */\n  const { isShorterSuggestedFilters } = useVerticalSpaceMVT();\n\n  const resetSuggestedFilter = (amenityId: HotelAmenityId | typeof HotelAttributeIds.sale) => {\n    const attributeFilters = [...activeFiltersState.attributeFilters];\n    const attributeIndex = attributeFilters.indexOf(amenityId);\n    const amenityFilters = [...activeFiltersState.amenityFilters];\n    const amenityIndex = amenityFilters.indexOf(amenityId);\n\n    if (amenityId === HotelAttributeIds.sale) {\n      if (attributeIndex !== -1) attributeFilters.splice(attributeIndex, 1);\n      else attributeFilters.push(amenityId);\n    } else {\n      if (amenityIndex !== -1) amenityFilters.splice(amenityIndex, 1);\n      else amenityFilters.push(amenityId);\n    }\n\n    const updatedActiveFiltersState = {\n      ...activeFiltersState,\n      amenityFilters,\n      attributeFilters,\n    };\n\n    onFilterCriteriaChange(updatedActiveFiltersState);\n  };\n  const handleOnClick = async (\n    amenityId: HotelAmenityId | typeof HotelAttributeIds.sale,\n    amenitySelected: boolean\n  ) => {\n    setSelectedAmenity(amenityId);\n    const suggestedFiltersA11YText = amenitySelected\n      ? t('suggestedFiltersRemoved')\n      : t('suggestedFiltersApplied');\n    setA11yText(suggestedFiltersA11YText);\n\n    resetSuggestedFilter(amenityId);\n    sendReward(GOALS.suggestedFilterEngagement);\n    await metrics.trackSuggestedFilters(amenityId);\n\n    setTimeout(() => {\n      if (amenitySelected) setA11yText('');\n    }, 2000);\n  };\n\n  return (\n    <div className=\"h-10 px-1\" key={amenity.name}>\n      <button\n        type=\"button\"\n        name={`${amenity?.name}  (${amenityListCount})`}\n        aria-label={`${amenity?.name} ${amenityListCount} ${\n          selectedAmenity === amenity.id ? a11yText : ''\n        }`}\n        className={cx(\n          'btn btn-primary-outline flex items-center rounded-full focus:border-primary',\n          {\n            'text-bg bg-primary outline-none active:text-text-inverse focus:text-text-inverse hover:text-text-inverse':\n              isAmenitySelected,\n            'h-[26px] gap-x-1': isShorterSuggestedFilters,\n            'gap-x-2': !isShorterSuggestedFilters,\n          }\n        )}\n        onClick={() => handleOnClick(amenity?.id as HotelAmenityId, isAmenitySelected)}\n      >\n        <span>\n          <Icon\n            name={AmenityIcons[amenity.id as HotelAmenityId] || amenity.id}\n            size={isShorterSuggestedFilters ? 'xs' : 'md'}\n          />\n        </span>\n        <span\n          aria-hidden\n          className={cx({\n            'text-xs font-normal': isShorterSuggestedFilters,\n            'text-sm font-bold': !isShorterSuggestedFilters,\n          })}\n        >\n          <span>{`${amenity.name} (${amenityListCount})`}</span>\n        </span>\n      </button>\n      {a11yText && selectedAmenity === amenity.id ? (\n        <span aria-live=\"assertive\" className=\"sr-only -order-1\">\n          <span role=\"status\">{`${amenity?.name} ${a11yText}`} </span>\n        </span>\n      ) : null}\n    </div>\n  );\n}\n","import { useTranslation } from 'next-i18next';\nimport { useAppDispatch, useAppState } from '../../providers/app-provider';\nimport { sendReward } from '@dx-ui/framework-conductrics';\nimport { GOALS } from '../../constants';\nimport { useWrappedRouter } from '../../hooks';\n\ntype CompareToggleProps = {\n  onChange?: () => void;\n};\n\nexport const CompareHotelsToggle = ({ onChange }: CompareToggleProps) => {\n  const { t } = useTranslation('compare-hotels');\n  const { safeQueryParams: queryParameters } = useWrappedRouter();\n\n  const { compareHotelsToggle, hotelsToCompare } = useAppState();\n  const dispatch = useAppDispatch();\n\n  const handleInputChange = () => {\n    if (onChange) onChange();\n    if (!compareHotelsToggle) sendReward(GOALS.compareHotelsToggleOn);\n    //when hotels to compare still selected and  toggle is set to false - remove previous selections\n    if (!compareHotelsToggle && hotelsToCompare.length)\n      dispatch({ type: 'SET_HOTELS_TO_COMPARE', payload: [] });\n    dispatch({ type: 'SET_COMPARE_HOTELS_TOGGLE', payload: !compareHotelsToggle });\n  };\n  return !queryParameters?.datesFlex ? (\n    <div className=\"relative ml-1 mr-2 text-nowrap pt-5 rtl:mb-2\">\n      <div className=\"flex\">\n        <label className=\"flex cursor-pointer items-center font-bold\">\n          <div className=\"relative mr-1 inline-flex\">\n            <input\n              className=\"peer sr-only\"\n              type=\"checkbox\"\n              onChange={handleInputChange}\n              checked={compareHotelsToggle}\n            />\n            <div className=\"peer h-6 w-12 rounded-full bg-[#CFCFCF] ring-offset-1 after:absolute after:top-[2px] after:size-5 after:rounded-full after:border after:border-bg-disabled after:bg-bg after:transition-all after:content-[''] peer-checked:bg-hilton peer-checked:after:border-bg peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-hilton motion-reduce:transition-none ltr:after:left-[4px] peer-checked:ltr:after:translate-x-full rtl:after:right-[4px] peer-checked:rtl:after:-translate-x-full\" />\n          </div>\n          <span className=\"text-sm first-letter:capitalize rtl:pr-2\">{t('compareHotels')}</span>\n        </label>\n      </div>\n    </div>\n  ) : null;\n};\n"],"names":["LoginModal","onClose","onLogin","showLoginModal","title","login","useAuth","router","useWrappedRouter","shouldUsePoints","selectedCurrency","sortType","useAppState","activeFiltersState","useFilterState","lang","locale","options","showCreatePassword","forgetInfoLink","url","env","forgetInfoUrl","PARTNER_FORGET_INFO_LINK","replace","secureInfoLink","GLOBAL_PRIVACY_URL","signInLink","generateSigninUrl","asPath","onSignInAttempt","useCallback","resp","persistSessionState","data","handleLogin","error","Dialog","isOpen","onDismiss","size","LoginIFrame","data-testid","frameSrc","onLoginAttempt","DisplayPoints","t","useTranslation","isAuthenticated","setShowLoginModal","useState","isLoaded","isMVTVariant","b","isMVT","useGetMVTSelections","agentId","DISPLAY_NUM_OF_AVAILABLE_POINTS","isProvisional","buttonLabel","PointsMessage","div","className","Trans","ns","i18nKey","components","SignInLink","button","onClick","handleSignInButtonClick","sendReward","GOALS","pointsLoginClick","type","aria-label","aria-live","params","URLSearchParams","window","location","search","set","pathname","query","toString","undefined","shallow","catch","logError","UsePoints","isInvalidOrUnavailableOffer","onChange","dispatch","useAppDispatch","metrics","useMetrics","isClient","useIsClient","a11yText","setA11yText","currenciesMap","useCurrencyConversion","selecteCurrencyDesc","get","description","isDisabled","isPointsDisabled","isChecked","shouldUsePointsChecked","infoPopupMessage","useGetUsePoints","isReady","label","span","cx","input","checked","disabled","handleUsePointsChange","a11yMessage","currencyName","payload","trackUsePointsChecked","setTimeout","InfoPopup","testId","Dropdown","handleChange","value","isMobile","isBrowser","innerWidth","getBreakpoint","htmlFor","select","id","name","evt","role","style","margin","map","option","isVisible","testIdLabel","SortByDropDown","filteredHotelCount","sortByOptions","sortOptions","useGetSortByOptions","filteredHotelsCount","handleUsePointsOnSortChange","isSortByPoints","sortBy","isSortByPrice","length","event","target","sortEngagement","propertySearchSort","ZoomInForPricing","MapContext","createContext","apiKey","clusterer","infoWindow","infoWindowContainer","setClusterer","setInfoWindow","setInfoWindowContainer","setMap","useMap","context","useContext","Error","children","MapInfoWindow","onCloseClick","position","useEffect","setPosition","addListener","google","maps","clearListeners","createPortal","MAP_MARKER_COLOR","POINTS_EXPLORER","active","inactive","DEFAULT","isActive","MapMarker","icon","MapStaticMarker","shouldShowCenterMarker","centerMarker","useRef","current","Marker","JSON","stringify","MARKER_Z_INDEX","getPriceMarkerPath","width","tailWidth","getPriceMarker","color","defaultColor","estimatedAverageCharacterWidth","path","scale","fillColor","fillOpacity","strokeColor","strokeWeight","labelOrigin","Point","MapMarkers","clusterOptions","activeMarker","iconClusterPath","markers","Map","staticMarker","setStaticMarker","markersToDisplay","React","child","_children","propsWithoutChildren","props","filter","Boolean","getMarker","addMarker","m","marker","scaledSize","Size","text","fontWeight","fontFamily","optimized","visible","zIndex","clickable","markerOptions","originalZindex","getZIndex","setZIndex","onMouseOver","onMouseOut","removeMarker","delete","mapMarker","open","shouldFocus","close","shouldHaveCluster","MarkerClusterer","averageCenter","minimumClusterSize","maxZoom","ignoreHidden","styles","textSize","textColor","height","anchorText","forEach","setIcon","getLabel","setLabel","markersToAdd","addMarkers","toRemove","_marker","find","_id","removeMarkers","InfoWindow","address","brandCode","containerClassName","ctyhocn","directionsLink","hotelBadges","useMediaQuery","Image","alt","src","linkCopy","Link","isNewWindow","SearchMapMarkers","centerCoordinate","matchId","sortedHotels","visibleHotels","slice","MAX_PRICE_PROPERTY_LIMIT","hotel","safeQueryParams","queryParameters","hasSpecialRatesDeepLinked","useMemo","isSpecialRatesDeeplinked","hashedData","hashedMPAData","isLoading","isMPADataLoading","useShopMultiPropAvail","ctyhocns","enabled","activeProperty","selectedCtyhocn","pageType","hasSpecialRate","currenciesError","isPointsExplorer","renoChipConfig","useRenovationChip","handleMapMarkerClicked","setBrandDetail","view","index","showPointsInMarker","propertySearch","includes","prefixPublicAssetUriWithAppPrefix","localization","leadRate","amenityIds","display","badges","summary","lowest","ratePlan","attributes","push","lat","coordinate","latitude","lng","longitude","hasConfidentialRate","confidentialRates","currentHotel","isNotBookable","status","datesFlex","displayPriceInMarker","totalRate","totalRateFmt","getCMAPrice","cmaTotalPriceIndicator","rateAmount","rateAmountFmt","amountAfterTax","amountAfterTaxFmt","lengthOfStay","getLengthOfStay","departureDate","markerPrice","isLocalCurrencySameAsHotelCurrency","currencyCode","formatAndConvertPrice","basePrice","currencyQueryError","fromCurrency","language","toCurrency","markerPointsOrPrice","hhonors","dailyRmPointsRateFmt","pointsRangeLabel","min","dailyRmPointsRateRoundFmt","max","markerLabel","displayPointsInMarker","suppressBrandLogo","isAffiliateHotel","addressLine1","city","HotelBadges","MapBase","initialBounds","onBoundsChange","onPan","onZoom","showInitialBounds","showQuadNodeBounds","mapRef","infoWindowRef","hasDrawnInitialBoundingBox","hasDrawnInitialQuadNodes","useRouter","resetMap","isMapInitialized","quadNodesData","useHotelQuadrantsQuery","listeners","initMap","clickableIcons","disableDefaultUI","zoomControl","zoomControlOptions","getLanguageDirection","ControlPosition","LEFT_TOP","RIGHT_TOP","restriction","latLngBounds","north","south","west","east","strictBounds","MAX_ZOOM","bounds","getBounds","toJSON","handleTilesLoaded","newInfoWindow","content","disableAutoPan","script","document","createElement","MAPS_URL","defer","async","onload","body","appendChild","listener","remove","setZoom","fitBounds","events","on","Rectangle","hotelQuadrants","Math","node","southwest","northeast","ref","MapProvider","Provider","handleBoundsChange","hasUserPanned","hasUserZoomed","MAP_API_KEY","showBbox","isDebugQuadTrees","LocationsMapMarkers","hotelsInBounds","disableMarkerPrice","hotelCtyhocn","hotelBrandCode","price","points","lead","dailyRmPointsRateNumFmt","getMapMarkerIcon","getMarkerPrice","MapBlock","showSpinner","visibleFilteredInBoundHotels","filterChange","saleFilterCount","showSaleFilter","isFindingHotels","h1SearchResultsContent","hotelCounterRef","pageHeading1Title","amenities","counterMessage","isListVisible","isSlimView","isDesktopMapView","useMapListToggle","isSearchPage","taggedConfig","useConfigRule","shouldShowMap","config","isConductricsLoaded","useConductricsSelection","HotelSearchResultSummaryPanel","customCounterMessage","customCounterSRMessage","hotelCount","onFilterChange","saleFilter","showingHotelDivRef","MapListToggleButton","showMapListToggleButton","Spinner","useVerticalSpaceMVT","isVerticalSpaceMVTLoaded","isVerticalSpaceVar1","c","isVerticalSpaceVar2","d","isVerticalSpaceVar3","e","isVerticalSpaceVar4","f","isVerticalSpaceVar5","g","isVerticalSpaceVar6","h","isVerticalSpaceVar7","i","isVerticalSpaceVar8","VERTICAL_SPACE_SAVINGS","MVTVariants","filterAndSortLabel","isFilterAndSortInAccordion","isShorterSuggestedFilters","isCurrencyAndSortInAllFiltersModal","isSuggestedFiltersInHorizontalScroll","guestInfo","pointsAvailable","focus","tabIndex","numPoints","aria-hidden","HotelCounter","count","currentPageIndex","customMessage","customSRMessage","pageStart","MAX_PROPERTIES_PER_LIST_VIEW_PAGE","pageEnd","message","srMessage","srCounter","setSrCounter","interval","setInterval","clearInterval","h2","aria-atomic","LogInBanner","closeLoginModal","reload","shopHonorsLogin","InfoMessageBanner","bannerClassName","iconClassName","iconName","openLoginModal","shopLoginClick","getTitleExpandedAbbreviation","substring","indexOf","lastIndexOf","sanitizeTitleMarkdown","_","abbreviation","expandedName","encodeURI","LocationsPageHeadingLevel1","titleAbbreviationExpanded","h1","Markdown","decodeURI","href","textDecoration","key","configShowMap","paginationIndex","handleSMBSwitch","isSMBContextSwitchingEnabled","useSmbToggle","smbChecked","smbRate","SMBProfileSwitcher","onInputChange","isSmbChecked","SuggestedFilterButtons","onFilterCriteriaChange","MOBILE_COMPARE_LIMIT","parking","hasFreeParking","hasValetParking","valetParkingCharge","chargeAmountFmt","hasSelfParking","selfParkingCharge","rooms","types","Set","room","suite","add","features","some","feature","numBeds","roomTypes","sort","a","localeCompare","isDesktop","compareCtyhocnsCount","image","ratios","imgUrl","getAspectRatioUrl","altText","noPhoto","getNoPhotoAvailable","variants","useGetCompareHotelsInfo","displayHotelCount","isEnabled","hasConnectingRooms","isDateFlex","isDateSearch","isDreams","numOfChildren","reduce","previous","hotelsQueryArr","queryKey","HotelDocument","placeholderData","keepPreviousData","retry","staleTime","results","useQueries","queries","hotelData","priceInfoCollection","isMPALoading","mpaConstraints","hotelInfo","isRenoHotel","currentHotelPriceInfo","isIndividualRoomsOnly","isIndividualRoomLimitExceeded","statusCode","hotelRateInfo","getMPAHotelRate","usePoints","priceInfo","getHotelLeadRateInfo","isNewHotel","isSaleHotel","distanceFmt","distance","getDistanceFromCenterFmt","images","tripAdvisorLocationSummary","hotelAmenities","parkingType","getParkingType","getRoomTypes","masterImage","getCompareImage","carousel","ctaHref","ctaLabel","messages","amenity","isFetching","result","CompareSkeleton","numHotels","Array","from","fill","CompareModal","hotelsToCompare","onStopCompare","isTablet","showRemoveCTA","modalSize","getModalSize","onRemoveHotel","ctyhocnToRemove","newCtyhocnList","TABLET_COMPARE_LIMIT","handleOnDismiss","isStopCompare","preventDefault","stopPropagation","bottomContent","stopComparingButton","handleStopComparing","dialogClassName","stickyHeader","table","tr","td","unoptimized","th","scope","TripAdvisorRating","showReviewCount","isCompare","numReviews","RateInfoMessages","rateMessages","Icon","ul","li","p","showNewWindowIcon","onCompare","showCompareModal","setShowCompareModal","compareHotelsToggle","showCompareBar","closeCompareModal","data-testId","compareHotelsSelected","compareLimit","DESKTOP_COMPARE_LIMIT","handleCompareHotels","compareHotelsCTAClick","Pagination","controls","loop","onPreviousClick","onNextClick","hideLabel","total","groupId","pageNumbers","apply","prevDisabled","nextDisabled","paginationLabel","ControlBack","aria-controls","onBlur","parseInt","currentTarget","ControlNext","filterStateCountryBrandHashedHotels","hashedHotelSummaryOptionsHotelData","Object","keys","country","state","obj","filterRegionHashedHotels","countriesInRegion","generateHotelSummaryOptionsQueryArray","quadNodes","guestLocationCountry","arr","HotelSummaryOptionsDocument","quadrantId","getBoundNodes","validNodes","isOverlappingBounds","bounds2","bounds1","validNode","isMatchFilter","brandCodeMatch","stateOrCountryMatch","brands","brand","code","countries","nodeCountry","countryCode","stateCode","states","useQuadNodes","stateOrCountryOrRegionFilter","isGuestLocationLoading","useLocation","isQuadNodesDataLoading","toNestedBounds","queryArr","isInitialRender","fetchHotelSummaryOptions","response","fetch","ok","statusText","json","useBlob","hotelSummaryExtractUrl","useQuery","queryFn","initialHashedHotelSummaryOptionsData","useHotelSummaryOptions","matchName","blobEnabled","isRegions","countryCodes","useGetRegions","isTypeRegion","regionName","queryClient","useQueryClient","stateOrCountryFilter","isBlobEnabledWithExtractURL","blobData","isFetchingBlobNodes","isInitialRenderBlobNodes","blobStatus","isFallbackToNodes","isFetchingQuadNodes","isInitialRenderQuadNodes","isInitial","hotelDataToUse","getHashedHotelSummaryOptionsDataFromCache","filteredHotelDataToUse","listMapViewButtonIconName","listMapViewButtonLabel","mapToggleButtonArrowDirection","shouldDisplayBrandedHotels","brandName","getBrandedHotels","hotelPageCards","getInfoBannerURLWithBrandRemoved","baseUrl","canonicalSlug","altSlugs","newURL","slug","numBrandedHotels","isDisplayBrandBanner","isPageBrandFilterEnabled","isEndOfResults","brandInfo","useBrandDetails","isGlobal","isGlobalPage","infoBannerMessage","atLeastOneBrandedHotel","linkWithoutBrandSlug","isBrand","OHW_BASE_URL","isHotelBrand","hasHotels","hasAgeBased","pricing","values","ageBasedPricing","hasChildAges","childAges","age","hasTMTPRatesSelected","employeeRate","friendsAndFamilyRate","ownerVIPRate","AgeBasedModal","isAgeBasedModalOpen","setIsAgeBasedModalOpen","isAgeBased","roomInfo","adults","kids","isNumber","RoomsModal","ageRange","agesRequired","ariaLabel","occupancyLimitMessage","onSubmit","handleRoomInfoSubmit","split","offerId","pnd","specPlan","fromId","travelAgentId","requestedRatesOnly","searchUriBuilder","urlParams","dates","arrivalDate","parseISO","flexibleDates","placeId","f_amenityIds","getValidFilters","amenityFilters","f_brandCodes","brandFilters","f_price","isPriceRangeValid","priceFilter","f_tripAdvisorRatings","getTARatingValue","ratingsFilter","availableHotelsOnly","showAvailableHotels","rates","mapRatesToSearchUriBuilder","spec_plan","join","numRooms","sessionToken","specialRateTokens","displayCurrency","adjoiningRoomStay","maxPoints","relative","useFormProps","defaultValues","setFocusOnFirstListViewCard","firstHotelCardItem","ulContainerRef","querySelector","setAttribute","useGetVisibleInBoundHotels","currentPageVisibleHotels","brandedVisibleHotels","otherVisibleHotels","getOtherHotels","Carousel","carouselRef","rect","useRect","noPhotoImageUrl","HILTON_ASSETS_URI","carouselImages","CarouselSingle","CompareHotelsCheckbox","isSubDesktop","showCompareCheckBox","isCompareCBChecked","isCompareCBDisabled","handleCompareHotelChange","selectedHotels","compareHotelsCheckboxSelected","KEY_AMENITIES","freeParking","freeBreakfast","indoorPool","outdoorPool","KeyHotelAmenities","keyAmenities","amenityId","AmenityIcons","useGetViewHotelDetailsLinkMVT","isViewHotelDetailsTestLoaded","isViewHotelDetailsVarA","isViewHotelDetailsVarB","VIEW_HOTEL_DETAILS_LINK","isViewHotelDetailsTest","isViewHotelDetailsTestVarB","preventFocus","blur","HotelNameHeader","preventNavigation","onFocus","h3","HotelCard","isTALoadingState","onDetailsClick","showImages","isListViewOnly","smMedViewPort","ctaMessage","customParams","hotelUrl","isHotelDataLoading","rateInfo","disclaimerMessages","transactionPropertyData","useGetHotelInfo","additionalParams","isHotelCard","hasNoRateInfo","logWarning","hotelName","classname","rateNameClassName","propertyNameClassName","hotelCardContentClassName","wrapperHotelCardHeaderAndCardContentClassName","hotelCardImage","distanceClassName","hidden","amexDisclaimer","disclaimer","heading","recentlyViewed","setRecentlyViewed","showRecentlyViewedChip","useRecentlyViewed","setHighlightedMapCtyhocn","srLocation","getHotelLocationName","stateName","countryName","onMouseEnter","onMouseLeave","isLoadingState","RateNameCTA","customRateInfo","onRateNameCTAClick","handleOnRateNameCTAClick","setPriceClicked","newHotelRoomsPageLoad","showCompare","HotelCardCTASkeleton","HotelCardSkeleton","useHotelCardsLogWarningMessages","hotels","hotelCardWarnings","setHotelCardWarnings","getWarningsForType","prev","cur","updateWarnings","warningMsgs","addHotelCardWarnings","warning","openDate","isBefore","Date","PastOpenDate","InvalidImageUrl","NoLeadRate","addHotelCardRateWarnings","warnings","acc","NoRequestedRate","MayBeAvailable","invalidImageUrl","mayBeAvailable","noLeadRate","noRequestedRate","pastOpenDate","initHotelCount","forwardRef","cardsClassName","rest","forwardedRef","handleDetailsClick","hdpButtonClick","hdpButtonClickTotal","skeletonCardCount","DEFAULT_HOTEL_CARD_SKELETON_COUNT","cnt","keyString","LogHotelCardsWarningMessage","SoldOutInfoMessageBanner","hotelPlaceId","toUpperCase","queryParam","HotelCards","displayName","ListViewLoadingShimmer","cardCount","ListView","isHSODataLoading","onPageChanged","showHotelImages","listRef","showListViewHotelImagesToggle","totalPages","ceil","showAmountAfterTax","useTrackSearchPricing","handlePagination","newPageIndex","trackPaginationClick","paginationNumber","actionType","setPaginationData","propertyResultList","propertyResults","brandedHotels","lastPageIndex","showHotelCardImage","noHotelsFoundBannerMessage","ListViewBrandBanner","shouldDisplayBrandBannerInCurrentPage","atLeastOneHotelNotBranded","displayAtEndOfBrandPageResults","CurrencyConverter","currency","currencyEngagement","converted","convert","trackCurrencyConverterClick","OSCCurrencyConverter","showDefaultOption","hasStackedDisplay","selectProps","BREAK_POINTS","freeze","small","medium","large","extraLarge","twoExtraLarge","twoXimgUrl","threeXImgUrl","srcUrl","cw","has","ch","aspectRatioVariants","entries","accum","breakPointName","breakPointWidth","round","shouldCenterInfoIcon","variant","findAmenity","wantedAmenityId","calculateSuggestedFilterCounts","filtersList","suggestedFilter","inBoundsHotel","isAtleastOneSuggestedFilter","suggestedFilterCounts","calculateTopSuggestedFilters","maxSuggestedFilters","topSuggestedFilters","topFilter","smallestCountKey","filterA","filterB","aCount","bCount","smallestCount","topSuggestedFilter","getSuggestedFiltersQuant","hasSalesFilter","MAX_SUGGESTED_AMENITY_FILTERS_WITH_SALE_FILTER","NUM_AMENITIES_SUGGESTIONS_WANTED","useSuggestedFilters","defaultConfig","configFromRule","useFeatureToggleConfig","suggestedSaleFilter","sale","HotelAttributeIds","suggestedFilters","suggestedFiltersOrderedList","showSuggestedFilters","SuggestedFiltersShimmer","shouldShowTitle","SuggestedFiltersTitle","SuggestedFiltersAmenities","suggestedFilterOrderedList","TaxonomyList","labelledBy","listItemClassname","getTaxonomyListClassName","amenityListCount","amenitySelected","attributeFilters","SuggestedFilterButton","isAmenitySelected","selectedAmenity","setSelectedAmenity","resetSuggestedFilter","attributeIndex","amenityIndex","splice","handleOnClick","suggestedFiltersA11YText","suggestedFilterEngagement","trackSuggestedFilters","CompareHotelsToggle","handleInputChange","compareHotelsToggleOn"],"sourceRoot":"","ignoreList":[]}