{"version":3,"file":"static/chunks/229-aecbbf6e5cb8b1c3.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/feature-tool-tip.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/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/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 'react-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 { ControlClose } from '@dx-ui/osc-controls';\nimport { useTranslation } from 'next-i18next';\nimport cx from 'classnames';\nimport { useEffect, useRef } from 'react';\n\nexport const FeatureToolTip = ({\n  absolutePosition,\n  cta,\n  containerClass,\n  message,\n  onDismiss,\n  shouldShowFeatureToolTip,\n  tailPosition,\n  title,\n}: {\n  absolutePosition: string;\n  cta?: { label: string; onClick: () => void };\n  containerClass?: string;\n  message?: string;\n  onDismiss: () => void;\n  shouldShowFeatureToolTip: boolean;\n  tailPosition?: string;\n  title?: string;\n}) => {\n  const { t } = useTranslation('osc-dialog');\n  const ref = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (ref.current) ref.current.focus();\n  }, []);\n\n  useEffect(() => {\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') {\n        onDismiss?.();\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n\n    return () => {\n      document.removeEventListener('keydown', handleKeyDown);\n    };\n  }, [onDismiss]);\n\n  return shouldShowFeatureToolTip ? (\n    <div className={cx('absolute z-50', absolutePosition)} ref={ref} tabIndex={-1} role=\"tooltip\">\n      <div\n        className={cx(\n          'relative flex flex-col gap-2 rounded bg-tier-diamond text-base text-bg shadow-[0px_4px_4px_0px_rgba(0,0,0,0.40)]',\n          containerClass\n        )}\n      >\n        {title ? <div className=\"font-bold\">{title}</div> : null}\n        <div>{message}</div>\n        {cta?.label ? (\n          <button\n            type=\"button\"\n            onClick={cta.onClick}\n            className=\"self-start rounded-lg border border-bg px-4 py-2 text-sm\"\n          >\n            {cta.label}\n          </button>\n        ) : null}\n        <div\n          className={cx(\n            'absolute bottom-[-8px] size-0 border-x-8 border-t-8 border-transparent border-t-tier-diamond',\n            tailPosition\n          )}\n        />\n      </div>\n      {!cta?.label ? (\n        <ControlClose\n          size=\"xs\"\n          onClick={onDismiss}\n          className=\"absolute end-0.5 top-0.5 text-bg\"\n          label={t('close')}\n        />\n      ) : null}\n    </div>\n  ) : null;\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-reverse 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 { COMPARE_ONBOARDING, GOALS } from '../../constants';\nimport { useLocalStorage, useMediaQuery } from 'usehooks-ts';\nimport { DESKTOP_COMPARE_LIMIT, MOBILE_COMPARE_LIMIT } from './compare-hotel-utils';\nimport { FeatureToolTip } from './feature-tool-tip';\nimport { useGetMVTSelections } from '../../hooks';\nimport { useRef } from 'react';\n\ntype CompareCheckboxProps = {\n  ctyhocn?: string;\n  onChange?: () => void;\n  isFirstCheckbox?: boolean;\n};\n\nexport const CompareHotelsCheckbox = ({\n  onChange,\n  ctyhocn: selectedCtyhocn,\n  isFirstCheckbox,\n}: CompareCheckboxProps) => {\n  const { t } = useTranslation('compare-hotels');\n  const isSubDesktop = useMediaQuery('(max-width: 1023px)');\n  const compareCheckboxRef = useRef<HTMLInputElement>(null);\n\n  const { hotelsToCompare, compareHotelsToggle: showCompareCheckBox } = useAppState();\n  const dispatch = useAppDispatch();\n\n  //NHCSEARCH-5449 | Compare Hotels Onboarding MVT\n  const {\n    isLoaded: isOnboardingMVTLoaded,\n    isMVTVariant: { c: isOnboardingVarC },\n  } = useGetMVTSelections({ agentId: COMPARE_ONBOARDING.agentId, MVTVariants: ['c'] });\n  const [isOnboarded, setIsOnboarded] = useLocalStorage('compare-hotels-onboarded', false);\n  const handleToolTipClose = () => {\n    setIsOnboarded(true);\n    if (compareCheckboxRef.current) compareCheckboxRef.current.focus();\n  };\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    if (!isOnboarded && isOnboardingVarC) setIsOnboarded(true);\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=\"relative 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            ref={compareCheckboxRef}\n          />\n        </label>\n      </div>\n      {/* NHCSEARCH-5449 | Compare Hotels Onboarding MVT */}\n      <FeatureToolTip\n        absolutePosition=\"-left-5 bottom-9\"\n        title={t('startComparing')}\n        message={t('selectFirstHotel')}\n        onDismiss={handleToolTipClose}\n        cta={{ label: t('gotIt'), onClick: handleToolTipClose }}\n        containerClass=\"w-[343px] p-3\"\n        shouldShowFeatureToolTip={\n          !!(isOnboardingMVTLoaded && isOnboardingVarC && !isOnboarded && isFirstCheckbox)\n        }\n      />\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 { 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';\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  isFirstAvailableProperty?: boolean;\n};\n\nconst HotelCard = ({\n  distance,\n  isTALoadingState,\n  onDetailsClick,\n  showImages,\n  isListViewOnly,\n  priceInfo,\n  hotelInfo,\n  isFirstAvailableProperty,\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  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  };\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=\"btn-sm btn-primary-text block self-start font-semibold\"\n                data-testid={`hotelDetails-${ctyhocn}`}\n                onClick={onDetailsClick}\n                type=\"button\"\n              >\n                <span>{t('hotelDetails')}</span>\n                <span className=\"sr-only\">&nbsp;{t('forHotel', { hotel: hotelName })}</span>\n                <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 ? (\n            <CompareHotelsCheckbox\n              ctyhocn={ctyhocn || ''}\n              isFirstCheckbox={isFirstAvailableProperty}\n            />\n          ) : 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 { forwardRef, useMemo, useState } 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  MAX_PROPERTIES_PER_LIST_VIEW_PAGE,\n} from '../../constants';\nimport { InfoMessageBanner } from '../info-message-banner/info-message-banner';\nimport { useGetPOIAirportInfoMVT } from './hooks/use-get-poi-airport-info-mvt';\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-5621\n    const [enablePOIAndAirportTest, setEnablePOIAndAirporTest] = useState(false);\n    useGetPOIAirportInfoMVT({ enableTest: enablePOIAndAirportTest });\n\n    const handleDetailsClick = (ctyhocn: string, name: string, index: number) => {\n      setEnablePOIAndAirporTest(true);\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 firstAvailableProperty = hotels.findIndex((hotel) =>\n      router.asPath.includes('/search/')\n        ? pricing?.[hotel?.ctyhocn]?.summary?.status?.type === 'AVAILABLE'\n        : hotel?.display?.open && hotel?.leadRate?.lowest\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        <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                isFirstAvailableProperty={_id === firstAvailableProperty}\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';\nimport { HIGHEST_AMENITIES_SUGGESTED_FILTERS } from '../constants';\nimport { useGetMVTSelections } from './use-get-mvt-selections';\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//NHCSEARCH-5346\nconst HIGHEST_CONVERTING_AMENITIES = ['evCharging', 'freeParking', 'airportShuttle', 'petsAllowed'];\nconst CONGFIGURED_SUGGESTED_FILTERS = [\n  'dx-location::locality::us::ny::new-york-city',\n  'dx-location::locality::us::ca::los-angeles',\n  'dx-location::locality::us::fl::orlando',\n  'dx-location::locality::us::il::chicago',\n  'dx-location::locality::us::dc::washington-dc',\n  'dx-location::locality::us::nv::las-vegas',\n  'dx-location::locality::gb::london',\n  'dx-location::locality::us::ga::atlanta',\n  'dx-location::locality::us::ca::orange',\n  'dx-location::locality::us::ca::san-diego',\n  'dx-location::locality::us::tx::dallas',\n  'dx-location::locality::us::ma::boston',\n  'dx-location::locality::us::hi::honolulu',\n  'dx-location::locality::us::fl::ft-lauderdale',\n  'dx-location::locality::us::fl::miami',\n  'dx-location::locality::us::tn::nashville',\n  'dx-location::locality::mx::cancun',\n  'dx-location::locality::us::fl::tampa',\n  'dx-location::locality::us::tx::houston',\n  'dx-location::locality::us::az::phoenix',\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 { isLoaded: isConducticsLoaded, isMVTVariant: isHighestConvertingAmenitiesVariant } =\n    useGetMVTSelections({ agentId: HIGHEST_AMENITIES_SUGGESTED_FILTERS.agentId });\n\n  const isHighestConvertingAmenitiesTest =\n    isConducticsLoaded && isHighestConvertingAmenitiesVariant.b;\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 =\n    isHighestConvertingAmenitiesTest && matchId && !CONGFIGURED_SUGGESTED_FILTERS.includes(matchId)\n      ? HIGHEST_CONVERTING_AMENITIES\n      : (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 { COMPARE_ONBOARDING, GOALS } from '../../constants';\nimport { useGetMVTSelections, useWrappedRouter } from '../../hooks';\nimport { FeatureToolTip } from './feature-tool-tip';\nimport { useLocalStorage } from 'usehooks-ts';\nimport { useRef, useState } from 'react';\n\ntype CompareToggleProps = {\n  onChange?: () => void;\n};\n\nexport const CompareHotelsToggle = ({ onChange }: CompareToggleProps) => {\n  const { t } = useTranslation('compare-hotels');\n  const { safeQueryParams: queryParameters, router } = useWrappedRouter();\n\n  const { compareHotelsToggle, hotelsToCompare } = useAppState();\n  const dispatch = useAppDispatch();\n\n  //NHCSEARCH-5449 | Compare Hotels Onboarding MVT\n  const toggleRef = useRef<HTMLInputElement>(null);\n  const {\n    isLoaded: isOnboardingMVTLoaded,\n    isMVTVariant: { b: isOnboardingVarB, c: isOnboardingVarC },\n  } = useGetMVTSelections({\n    agentId: COMPARE_ONBOARDING.agentId,\n    MVTVariants: ['b', 'c'],\n    isProvisional: router.locale === 'en',\n  });\n  const [isOnboarded, setIsOnboarded] = useLocalStorage('compare-hotels-onboarded', false);\n  const [isCompareToolTipOpen, setIsCompareToolTipOpen] = useState(true);\n  const handleToolTipClose = () => {\n    if (isOnboardingVarB) setIsOnboarded(true);\n    setIsCompareToolTipOpen(false);\n    if (toggleRef.current) toggleRef.current.focus();\n  };\n  const showCompareOnboardingToolTip = isOnboardingMVTLoaded && !isOnboarded;\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    if (isOnboardingVarB) setIsOnboarded(true);\n    setIsCompareToolTipOpen(false);\n  };\n  return !queryParameters?.datesFlex ? (\n    <div className=\"relative ml-1 mr-2 text-nowrap pt-5 rtl:mb-2\">\n      {/* NHCSEARCH-5449 | Compare Hotels Onboarding MVT */}\n      <FeatureToolTip\n        absolutePosition=\"-left-2 -top-10\"\n        tailPosition=\"left-6\"\n        message={t('newFeature')}\n        onDismiss={handleToolTipClose}\n        containerClass=\"w-[115px] py-3 pl-3 pr-4\"\n        shouldShowFeatureToolTip={\n          !!(showCompareOnboardingToolTip && isOnboardingVarB && isCompareToolTipOpen)\n        }\n      />\n      <FeatureToolTip\n        absolutePosition=\"[@media(max-width:422px)]:-right-24 [@media(min-width:423px)]:-right-48  [@media(min-width:588px)]:-right-2 [@media(min-width:768px)]:-right-44 [@media(min-width:876px)]:-right-2 [@media(min-width:1200px)]:left-0 -top-36\"\n        tailPosition=\"[@media(max-width:422px)]:left-1/3 [@media(min-width:423px & max-width:587px)]:left-28 [@media(min-width:588px)]:left-48 [@media(min-width:768px)]:left-6 [@media(min-width:876px)]:left-48 [@media(min-width:1124px)]:left-2 [@media(min-width:1201px)]:-translate-x-44\"\n        title={t('compareAndBook')}\n        message={t('compareKeyFeatures')}\n        onDismiss={handleToolTipClose}\n        cta={{ label: t('ok'), onClick: handleToolTipClose }}\n        containerClass=\"w-[343px] p-3\"\n        shouldShowFeatureToolTip={\n          !!(showCompareOnboardingToolTip && isOnboardingVarC && isCompareToolTipOpen)\n        }\n      />\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              ref={toggleRef}\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","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","clusterOptions","MapMarkers","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","anchor","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","_","abbreviation","expandedName","encodeURI","LocationsPageHeadingLevel1","titleAbbreviationExpanded","h1","Markdown","decodeURI","href","textDecoration","key","sanitizeTitleMarkdown","configShowMap","paginationIndex","handleSMBSwitch","isSMBContextSwitchingEnabled","useSmbToggle","smbChecked","smbRate","SMBProfileSwitcher","onInputChange","isSmbChecked","SuggestedFilterButtons","onFilterCriteriaChange","FeatureToolTip","absolutePosition","cta","containerClass","shouldShowFeatureToolTip","tailPosition","handleKeyDown","addEventListener","removeEventListener","ControlClose","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","countriesInRegion","generateHotelSummaryOptionsQueryArray","quadNodes","guestLocationCountry","arr","HotelSummaryOptionsDocument","quadrantId","getBoundNodes","validNodes","isOverlappingBounds","bounds1","bounds2","validNode","isMatchFilter","brandCodeMatch","stateOrCountryMatch","brands","brand","code","countries","nodeCountry","countryCode","stateCode","states","useQuadNodes","stateOrCountryOrRegionFilter","isGuestLocationLoading","useLocation","isQuadNodesDataLoading","toNestedBounds","queryArr","isHotelSummaryQueryEnabled","isInitialRender","fetchHotelSummaryOptions","response","fetch","ok","statusText","json","useBlob","hotelSummaryExtractUrl","useQuery","queryFn","useHotelSummaryOptions","initialHashedHotelSummaryOptionsData","matchName","blobEnabled","isRegions","countryCodes","useGetRegions","isTypeRegion","regionName","queryClient","useQueryClient","stateOrCountryFilter","isBlobEnabledWithExtractURL","blobData","isFetchingBlobNodes","isInitialRenderBlobNodes","blobStatus","isFallbackToNodes","isFetchingQuadNodes","isInitialRenderQuadNodes","isInitial","hotelDataToUse","getHashedHotelSummaryOptionsDataFromCache","filteredHotelDataToUse","filterRegionHashedHotels","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","isFirstCheckbox","isSubDesktop","compareCheckboxRef","showCompareCheckBox","isOnboardingMVTLoaded","isOnboardingVarC","COMPARE_ONBOARDING","isOnboarded","setIsOnboarded","useLocalStorage","handleToolTipClose","isCompareCBChecked","isCompareCBDisabled","handleCompareHotelChange","selectedHotels","compareHotelsCheckboxSelected","KEY_AMENITIES","freeParking","freeBreakfast","indoorPool","outdoorPool","KeyHotelAmenities","keyAmenities","amenityId","AmenityIcons","preventNavigation","preventFocus","blur","HotelNameHeader","onFocus","h3","HotelCard","isTALoadingState","onDetailsClick","showImages","isListViewOnly","isFirstAvailableProperty","smMedViewPort","ctaMessage","customParams","hotelUrl","isHotelDataLoading","rateInfo","disclaimerMessages","transactionPropertyData","useGetHotelInfo","additionalParams","isHotelCard","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","showCompare","HotelCardCTASkeleton","HotelCardSkeleton","HotelCards","forwardRef","hotels","cardsClassName","initHotelCount","rest","forwardedRef","enablePOIAndAirportTest","setEnablePOIAndAirporTest","useGetPOIAirportInfoMVT","enableTest","handleDetailsClick","skeletonCardCount","DEFAULT_HOTEL_CARD_SKELETON_COUNT","cnt","keyString","firstAvailableProperty","findIndex","SoldOutInfoMessageBanner","hotelPlaceId","toUpperCase","queryParam","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","HIGHEST_CONVERTING_AMENITIES","CONGFIGURED_SUGGESTED_FILTERS","useSuggestedFilters","isConducticsLoaded","isHighestConvertingAmenitiesVariant","HIGHEST_AMENITIES_SUGGESTED_FILTERS","isHighestConvertingAmenitiesTest","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","updatedActiveFiltersState","handleOnClick","suggestedFiltersA11YText","suggestedFilterEngagement","trackSuggestedFilters","CompareHotelsToggle","toggleRef","isOnboardingVarB","isCompareToolTipOpen","setIsCompareToolTipOpen","showCompareOnboardingToolTip","handleInputChange","compareHotelsToggleOn"],"sourceRoot":"","ignoreList":[]}