{"version":3,"file":"static/chunks/41-a3f0c179c83581ff.js","mappings":"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","sources":["webpack://_N_E/./components/hotel-card/utils/hotel-info-utils.ts","webpack://_N_E/./components/hotel-card/utils/hotel-lead-rate-utils.ts","webpack://_N_E/../../libs/osc/carousel/src/lib/carousel-no-image.tsx","webpack://_N_E/../../libs/osc/carousel/src/lib/carousel-image.tsx","webpack://_N_E/../../libs/osc/carousel/src/lib/utils/carousel-analytics.ts","webpack://_N_E/../../libs/osc/carousel/src/lib/carousel-single.tsx","webpack://_N_E/../../libs/osc/carousel/src/index.ts"],"sourcesContent":["import type { HotelBadgeTypes } from '../hotel-badges';\nimport type { RateMessage, RateInfoMessage } from '../../rate-name-cta/rate-name-cta';\nimport type { TALocationSummary } from '../../trip-advisor/trip-advisor-review';\nimport type {\n  Maybe,\n  Hotel,\n  ShopMultiPropAvailPointsQuery,\n  HotelImage,\n  HotelImageRatio,\n  HotelImageVariant,\n  HotelAmenityId,\n} from '@dx-ui/queries-dx-shop-search-ui';\nimport type { HotelType } from '../../../providers/app-provider/app-provider.types';\nimport { isAfter } from 'date-fns';\nimport type { TFunction } from 'i18next';\nimport type { QueryParameters } from '../../../constants';\nimport { INDIVIDUAL_ROOMS_MPA_STATUS_CODE, INDIVIDUAL_ROOMS_MAX } from '../../../constants';\n\nexport type HotelInfoParams = {\n  hotelInfo?: HotelType | Maybe<Hotel> | null | undefined;\n  priceInfo?: ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0] | null | undefined;\n  additionalParams?: { [key: string]: boolean | string | string[] | null | undefined };\n};\n\nexport type HotelInfoAttributes = {\n  amenities?: HotelAmenityId[];\n  badges?: HotelBadgeTypes[];\n  carouselImages?:\n    | (Pick<HotelImage, 'altText'> &\n        {\n          ratios?: Maybe<Pick<HotelImageRatio, 'url' | 'size'>[]>;\n          variants?: Maybe<Pick<HotelImageVariant, 'url' | 'size'>[]>;\n        }[])\n    | undefined;\n  ctaLabel?: RateMessage;\n  ctaHref?: string;\n  ctaMessage?: RateInfoMessage;\n  customParams?: { [key: string]: string | boolean };\n  disclaimerMessages?: RateInfoMessage[];\n  hotelName?: string;\n  hotelUrl?: string;\n  isHotelDataLoading?: boolean;\n  isNewHotel?: boolean;\n  isSaleHotel?: boolean;\n  isRenoHotel?: boolean;\n  masterImage?: Pick<HotelImage, 'altText'> & {\n    variants?: Pick<HotelImageVariant, 'url' | 'size'>[];\n    ratios?: Maybe<Pick<HotelImageRatio, 'url' | 'size'>[]>;\n  };\n  messages?: RateInfoMessage[];\n  rateInfo?: RateInfoMessage[];\n  suppressBrandLogo?: boolean;\n  transactionPropertyData?: HotelTransactionPropertyData;\n  tripAdvisorLocationSummary?: TALocationSummary;\n};\n\ntype HotelTransactionPropertyData = {\n  propCode: string;\n  srp: string;\n  price: string;\n  currency: string;\n};\n\nexport const isLocalCurrencySameAsHotelCurrency = (\n  selectedCurrency: string | null,\n  hotelCurrency?: string\n) => selectedCurrency === '' || selectedCurrency === hotelCurrency;\n\ntype buttonLabelsArg = {\n  t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page']>;\n  isAdultsOnly?: boolean | null;\n  isNoResEnabled?: boolean | null;\n};\nexport const getButtonLabels = ({\n  t,\n  isAdultsOnly,\n  isNoResEnabled,\n}: buttonLabelsArg): Record<string, string> => ({\n  AVAILABLE: t('viewRates'),\n  MAY_BE_AVAILABLE: t('maybeAvailable'),\n  NOT_OPEN: isNoResEnabled ? '' : t('selectDates'),\n  NOT_AVAILABLE: isAdultsOnly ? '' : t('selectDates'),\n});\n\ntype AvailabilityTextArgs = {\n  t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page']>;\n  isPreSell?: boolean | null;\n  isPreOpen?: boolean | null;\n  isSoldOut?: boolean | null;\n  openDate?: string | null;\n  numChildren?: number;\n  occupants?: string;\n  preOpenMsg?: string | null;\n  isOccupancyExceeded?: boolean;\n  isIndividualRoomsOnly?: boolean;\n};\ntype AvailabilityTextRetVal = {\n  comingSoonAndSoldOutCaption?: string;\n  comingSoonAndSoldOutMessage?: string;\n};\n\nconst getPreAvailabilityText = ({\n  t,\n  isPreSell,\n  openDate,\n  preOpenMsg,\n}: Pick<AvailabilityTextArgs, 't' | 'isPreSell' | 'isPreOpen' | 'openDate' | 'preOpenMsg'>) => {\n  const caption = t('rate-name-cta:notOpen');\n  const message = preOpenMsg\n    ? preOpenMsg\n    : isPreSell\n    ? t('rate-name-cta:preSell', { preSellDate: openDate })\n    : t('rate-name-cta:preOpen', { preOpenDate: openDate });\n\n  return { comingSoonAndSoldOutCaption: caption, comingSoonAndSoldOutMessage: message };\n};\n\nconst getSoldOutOrUnavailableText = ({\n  t,\n  isOccupancyExceeded,\n  numChildren,\n  occupants,\n}: Pick<AvailabilityTextArgs, 't' | 'isOccupancyExceeded' | 'numChildren' | 'occupants'>) => {\n  let caption: string | undefined = undefined;\n  let message: string | undefined = undefined;\n\n  if (isOccupancyExceeded) {\n    caption = t('rate-name-cta:occupancyExceededCaption');\n    message = t('rate-name-cta:occupancyExceededMsg', { numGuests: occupants });\n  } else if (numChildren) {\n    caption = t('rate-name-cta:adultsOnly');\n    message = t('rate-name-cta:unableBookWithKid', { count: numChildren });\n  } else {\n    caption = t('rate-name-cta:soldOutCaption');\n    message = t('rate-name-cta:notAvailable');\n  }\n\n  return { comingSoonAndSoldOutCaption: caption, comingSoonAndSoldOutMessage: message };\n};\n\nexport const getAvailabilityText = (args: AvailabilityTextArgs): AvailabilityTextRetVal => {\n  const {\n    t,\n    isPreSell,\n    isPreOpen,\n    isSoldOut,\n    openDate,\n    numChildren,\n    occupants,\n    preOpenMsg,\n    isOccupancyExceeded,\n    isIndividualRoomsOnly,\n  } = args;\n\n  if (isPreSell || isPreOpen) {\n    return getPreAvailabilityText({ t, isPreSell, isPreOpen, openDate, preOpenMsg });\n  }\n\n  if (isIndividualRoomsOnly) {\n    return {\n      comingSoonAndSoldOutCaption: t('rate-name-cta:individualRooms'),\n      comingSoonAndSoldOutMessage: t('rate-name-cta:individualRoomsMsg'),\n    };\n  }\n\n  if (isSoldOut) {\n    return getSoldOutOrUnavailableText({ t, isOccupancyExceeded, numChildren, occupants });\n  }\n\n  return {\n    comingSoonAndSoldOutCaption: undefined,\n    comingSoonAndSoldOutMessage: undefined,\n  };\n};\n\nexport const getPreSellPreOpenInfo = (\n  language: string,\n  isHotelPreOpen?: boolean | null,\n  preOpenDate?: string | null,\n  preSellDate?: string | null,\n  resEnabled?: boolean | null\n) => {\n  const preSell = isHotelPreOpen && preSellDate ? new Date(preSellDate || '') : undefined;\n  const preOpen = isHotelPreOpen && preOpenDate ? new Date(preOpenDate || '') : undefined;\n  const isPreSell = preSell && isAfter(preSell, new Date());\n  const isPreOpen = preOpen && isAfter(preOpen, new Date());\n  const isNoResPreOpen = isPreOpen && !resEnabled;\n  const isResPreSell = isPreSell && resEnabled;\n\n  return {\n    isResPreSell,\n    isPreOpen,\n    isNoResPreOpen,\n    preSellDateFmt:\n      isPreSell && preSell\n        ? new Date(\n            preSell.getUTCFullYear(),\n            preSell.getUTCMonth(),\n            preSell.getUTCDate()\n          ).toLocaleDateString(language, { dateStyle: 'long' })\n        : '',\n    preOpenDateFmt:\n      isPreOpen && preOpen\n        ? new Date(\n            preOpen.getUTCFullYear(),\n            preOpen.getUTCMonth(),\n            preOpen.getUTCDate()\n          ).toLocaleDateString(language, { year: 'numeric', month: 'long' })\n        : '',\n  };\n};\n\nexport const getRateInfoTextClassName = ({\n  className,\n  hasColumnLayout,\n  isCaption,\n  isCompare,\n  textType,\n  type,\n}: {\n  className?: string;\n  hasColumnLayout?: boolean;\n  isCaption?: boolean;\n  isCompare?: boolean;\n  textType?: 'prefix' | 'heading' | 'suffix' | '';\n  type?: string;\n}) => {\n  let textClassName = className ?? '';\n  if (type === 'DiamondRate') textClassName += ' text-primary text-xs';\n  if (type === 'UsePoints') textClassName += ' text-tertiary';\n  if (isCaption) {\n    if (textType === 'heading') {\n      textClassName += ' font-bold text-lg ';\n      textClassName += hasColumnLayout ? 'md:text-xl' : 'md:text-2xl';\n    }\n    if (textType === 'prefix') textClassName += ' font-bold text-xs';\n    if (textType === 'suffix') textClassName += ' text-xs';\n  }\n  if (!textClassName) textClassName = 'text-text-alt text-xs';\n  return isCompare\n    ? `text-left rtl:text-right ${textClassName}`\n    : `text-right rtl:text-left ${textClassName}`;\n};\n\nexport const getMPARateInfo = (\n  numOfChildren: number,\n  usePoints: boolean,\n  isDateFlex: boolean,\n  hasSpecialRate?: boolean,\n  allowAdultsOnly?: boolean,\n  priceInfo?: ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0] | null\n) => {\n  const isAdultsOnly =\n    allowAdultsOnly &&\n    ((priceInfo?.summary?.status?.type === 'NOT_AVAILABLE' && priceInfo?.statusCode === 2005) ||\n      numOfChildren > 0);\n  const isOccupancyExceeded = priceInfo?.statusCode === 2001;\n  const hasConfidentialRate = priceInfo?.summary?.lowest?.ratePlan?.confidentialRates;\n  const lengthOfStay = priceInfo?.lengthOfStay;\n  const pointsAvailable = priceInfo?.summary?.hhonors?.dailyRmPointsRateFmt;\n  const isDiamondRate = priceInfo?.summary?.lowest?.ratePlan?.specialRateType === 'diamond48';\n  const rateMessage = isDateFlex\n    ? undefined\n    : isDiamondRate\n    ? priceInfo?.summary?.hhonors?.ratePlan?.ratePlanName ||\n      priceInfo?.summary?.lowest?.ratePlan?.ratePlanName\n    : hasSpecialRate\n    ? priceInfo?.summary?.lowest?.ratePlan?.ratePlanName\n    : usePoints && pointsAvailable\n    ? priceInfo?.summary?.hhonors?.ratePlan?.ratePlanName\n    : priceInfo?.summary?.lowest?.ratePlan?.ratePlanName || '';\n\n  const hasRateChange =\n    usePoints && Boolean(pointsAvailable)\n      ? priceInfo?.summary?.hhonors?.rateChangeIndicator\n      : priceInfo?.summary?.lowest?.rateChangeIndicator;\n\n  const showDisplayFeeTransparencySubMsg =\n    !priceInfo?.summary?.lowest?.cmaTotalPriceIndicator &&\n    !usePoints &&\n    Boolean(priceInfo?.summary?.lowest?.feeTransparencyIndicator);\n\n  return {\n    isAdultsOnly,\n    isOccupancyExceeded,\n    hasConfidentialRate,\n    rateMessage,\n    hasRateChange,\n    showDisplayFeeTransparencySubMsg,\n    lengthOfStay,\n    pointsAvailable,\n    isDiamondRate,\n    isAgeBasedPricing: !!priceInfo?.ageBasedPricing,\n  };\n};\n\nexport const isIndividualRoomLimitExceeded = (\n  statusCode?: Maybe<number>,\n  queryParameters?: QueryParameters\n) => {\n  const numRooms = queryParameters?.numRooms;\n  return (\n    statusCode === INDIVIDUAL_ROOMS_MPA_STATUS_CODE && !!numRooms && numRooms > INDIVIDUAL_ROOMS_MAX\n  );\n};\n","import type { QueryParameters } from '../../../constants';\nimport { AMEX_EXCEPTION_CTYHOCN, env } from '../../../constants';\nimport type { AvailStatus, PageType } from '../../../utils';\nimport { generateCTAFunnelUrl } from '../../../utils';\nimport type { MapLanguage } from '@dx-ui/framework-uri-builder';\nimport type { ConversionCurrencyOptions } from '@dx-ui/osc-currency-converter';\nimport { formatAndConvertPrice } from '@dx-ui/osc-currency-converter';\nimport {\n  getAvailabilityText,\n  getPreSellPreOpenInfo,\n  isLocalCurrencySameAsHotelCurrency,\n} from './hotel-info-utils';\nimport type { RateInfoMessage, RateMessage } from '../../rate-name-cta/rate-name-cta';\nimport type { HotelType } from '../../../providers/app-provider/app-provider.types';\nimport type { TFunction } from 'i18next';\nimport type { Hotel } from '@dx-ui/queries-dx-shop-search-ui';\nimport type { HotelInfoAttributes } from './hotel-info-utils';\nimport type { DXError } from '@dx-ui/types-graphql';\n\ntype HotelSummaryData = Pick<\n  HotelType,\n  | 'amenityIds'\n  | 'brandCode'\n  | 'contactInfo'\n  | 'ctyhocn'\n  | 'disclaimers'\n  | 'display'\n  | 'distance'\n  | 'distanceFmt'\n  | 'facilityOverview'\n  | 'leadRate'\n  | 'localization'\n  | 'name'\n  | 'tripAdvisorLocationSummary'\n>;\n\nexport type HotelCardData =\n  | (Pick<\n      Hotel,\n      | 'amenities'\n      | 'brandCode'\n      | 'contactInfo'\n      | 'ctyhocn'\n      | 'disclaimers'\n      | 'display'\n      | 'distance'\n      | 'distanceFmt'\n      | 'externalResSystem'\n      | 'facilityOverview'\n      | 'leadRate'\n      | 'localization'\n      | 'name'\n      | 'tripAdvisorLocationSummary'\n    > &\n      HotelSummaryData)\n  | null;\n\nexport const getLeadRateAvailStatus = (\n  display: HotelType['display'],\n  leadRate: HotelType['leadRate']\n): AvailStatus =>\n  display?.open === false ? 'NOT_OPEN' : !leadRate?.lowest ? 'NOT_AVAILABLE' : 'AVAILABLE';\n\nexport function getHotelLeadRateInfo({\n  hotelData,\n  locale,\n  ctyhocn,\n  usePoints,\n  selectedCurrency,\n  hasConnectingRooms,\n  currenciesError,\n  currenciesMap,\n  pageType,\n  t,\n  queryParameters,\n}: {\n  hotelData: HotelCardData; //HotelData | HotelType | null | undefined;\n  locale: string;\n  ctyhocn: string | undefined;\n  usePoints: boolean;\n  selectedCurrency: string | null;\n  hasConnectingRooms: boolean;\n  currenciesError: DXError | null;\n  currenciesMap: Map<string, ConversionCurrencyOptions>;\n  pageType: PageType;\n  t: TFunction<['hotel-card', 'rate-name-cta', 'locations-page']>;\n  queryParameters: QueryParameters | undefined;\n}): HotelInfoAttributes {\n  const availStatus = getLeadRateAvailStatus(hotelData?.display, hotelData?.leadRate);\n\n  const { isResPreSell, preSellDateFmt, isNoResPreOpen, isPreOpen, preOpenDateFmt } =\n    getPreSellPreOpenInfo(\n      locale,\n      availStatus === 'NOT_OPEN',\n      hotelData?.display?.openDate,\n      hotelData?.display?.resEnabledDate,\n      hotelData?.display?.resEnabled\n    );\n\n  const href = isNoResPreOpen\n    ? undefined\n    : generateCTAFunnelUrl({\n        availStatus,\n        host: env.HONORS_HOST,\n        ctyhocn: ctyhocn as string,\n        shouldUsePoints: usePoints,\n        currencyCode: selectedCurrency as string,\n        preOpenDate: (isResPreSell\n          ? hotelData?.display?.resEnabledDate\n          : isPreOpen\n          ? hotelData?.display?.openDate\n          : '') as string,\n        hasConnectingRooms,\n        isPointsExplorer: false,\n        isDreams: true,\n        lang: locale as MapLanguage,\n        queryParameters,\n      });\n\n  // for dream pages prices are fetched server side before currency query is fired. so if currency query isnt complete show initial rates (local) first\n  const convertedPrice = isLocalCurrencySameAsHotelCurrency(\n    selectedCurrency,\n    hotelData?.localization?.currencyCode || ''\n  )\n    ? hotelData?.leadRate?.lowest?.rateAmountFmt\n    : formatAndConvertPrice({\n        basePrice: !hotelData?.leadRate?.lowest?.rateAmount\n          ? undefined\n          : hotelData?.leadRate?.lowest?.rateAmount,\n        currencyQueryError: !!currenciesError,\n        fromCurrency: currenciesMap?.get('USD'),\n        language: locale,\n        toCurrency: currenciesMap?.get(selectedCurrency as string),\n      }) || hotelData?.leadRate?.lowest?.rateAmountFmt;\n  const points = hotelData?.leadRate?.hhonors?.lead?.dailyRmPointsRateNumFmt;\n\n  const disclaimerMessages: RateInfoMessage[] = [];\n\n  let amexDisclaimer = '';\n  if (pageType.isResorts) {\n    const amex =\n      (hotelData?.disclaimers?.length &&\n        hotelData?.disclaimers.find((disclaimer) => disclaimer.type === 'amexUnsupported')) ||\n      undefined;\n    amexDisclaimer = ctyhocn === AMEX_EXCEPTION_CTYHOCN ? t('amexDisclaimer') : amex?.desc ?? '';\n  }\n  if (amexDisclaimer)\n    disclaimerMessages.push({\n      heading: {\n        text: amexDisclaimer,\n      },\n      type: 'amexDisclaimer',\n    });\n  disclaimerMessages.push({\n    heading: {\n      text: usePoints\n        ? t('locations-page:pointsLegalDisclaimer')\n        : t('locations-page:legalDisclaimer'),\n    },\n  });\n\n  //if we use usePoints but points rate is not defined fallback to currency rate\n  const rate = usePoints ? points || convertedPrice : convertedPrice;\n  const ratePlanName = usePoints\n    ? hotelData?.leadRate?.hhonors?.lead?.ratePlan?.ratePlanName ??\n      hotelData?.leadRate?.lowest?.ratePlan?.ratePlanName\n    : hotelData?.leadRate?.lowest?.ratePlan?.ratePlanName;\n  const ratePlanDesc = usePoints\n    ? hotelData?.leadRate?.hhonors?.lead?.ratePlan?.ratePlanDesc ??\n      hotelData?.leadRate?.lowest?.ratePlan?.ratePlanDesc\n    : hotelData?.leadRate?.lowest?.ratePlan?.ratePlanDesc;\n  const buttonLabel = isNoResPreOpen ? undefined : t('selectDates');\n\n  const { comingSoonAndSoldOutCaption, comingSoonAndSoldOutMessage } = getAvailabilityText({\n    t,\n    isPreSell: isResPreSell,\n    isPreOpen,\n    isSoldOut: availStatus === 'NOT_AVAILABLE',\n    openDate: isResPreSell ? preSellDateFmt : isPreOpen ? preOpenDateFmt : undefined,\n    preOpenMsg: hotelData?.display?.preOpenMsg,\n  });\n  const showDisplayFeeTransparencySubMsg =\n    !hotelData?.leadRate?.lowest?.cmaTotalPriceIndicator &&\n    !usePoints &&\n    Boolean(hotelData?.leadRate?.lowest?.feeTransparencyIndicator);\n\n  let isNewHotel = false;\n\n  if (hotelData?.amenities)\n    isNewHotel = !!hotelData?.amenities?.find((amenity) => amenity.id === 'newHotel');\n  else if (hotelData?.amenityIds)\n    isNewHotel = !!hotelData?.amenityIds?.find((amenity) => amenity === 'newHotel');\n\n  const tripAdvisorLocationSummary = hotelData?.tripAdvisorLocationSummary || null;\n\n  const messages: RateInfoMessage[] = [];\n\n  const hotelName = hotelData?.name || '';\n\n  if (comingSoonAndSoldOutMessage) {\n    messages.push(\n      {\n        isCaption: true,\n        heading: { text: comingSoonAndSoldOutCaption || '' },\n      },\n      { heading: { text: comingSoonAndSoldOutMessage || '' } }\n    );\n  } else if (!!usePoints && !!points) {\n    messages.push(\n      {\n        isCaption: true,\n        heading: {\n          text: points || '',\n          className: 'text-xl font-headline',\n        },\n        prefix: { text: t('priceFrom') },\n        suffix: {\n          text: t('pointsPerNight'),\n          infoIconOrPopup: {\n            align: 'right',\n            infoText: ratePlanDesc || '',\n            id: `lead-rate-info-${ctyhocn}`,\n          },\n        },\n        type: 'UsePoints',\n      },\n      {\n        heading: { text: ratePlanName || '' },\n      }\n    );\n  } else if ((!!rate && !!ratePlanDesc) || (usePoints && !points && !!rate && !!ratePlanDesc)) {\n    const displayFeeTransparencySubMsg = showDisplayFeeTransparencySubMsg\n      ? { heading: { text: t('rate-name-cta:includesFees') } }\n      : undefined;\n    messages.push(\n      {\n        isCaption: true,\n        heading: {\n          text: convertedPrice || '',\n          infoIconOrPopup: {\n            align: 'right',\n            infoText: ratePlanDesc || '',\n            id: `lead-rate-info-${ctyhocn}`,\n          },\n        },\n        prefix: { text: t('priceFrom') },\n      },\n      displayFeeTransparencySubMsg as RateInfoMessage,\n      {\n        heading: { text: ratePlanName || '' },\n      }\n    );\n  }\n\n  const ctaLabel = buttonLabel\n    ? ({\n        text: buttonLabel,\n        type: usePoints && !!points ? 'UsePoints' : undefined,\n      } as RateMessage)\n    : undefined;\n\n  //NHCSEARCH-5249 MVT Compare Properties\n  let customParams = {};\n  if (availStatus === 'AVAILABLE') customParams = { showCompare: true };\n  return {\n    disclaimerMessages,\n    isNewHotel,\n    ctaLabel,\n    ctaHref: href,\n    customParams,\n    hotelName,\n    messages,\n    tripAdvisorLocationSummary,\n  };\n}\n","import cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\n\nexport const CarouselNoImage = ({\n  className,\n  isFullSize = false,\n}: {\n  className?: string;\n  isFullSize?: boolean;\n}) => {\n  const { t } = useTranslation('osc-carousel');\n\n  return (\n    <div\n      className={cx(\n        'flex items-center justify-center bg-bg-alt @container/no-image',\n        { 'h-full w-full': isFullSize, 'aspect-[3/2]': !isFullSize },\n        className\n      )}\n    >\n      <span className=\"text-xs text-text-alt @[150px]/no-image:text-base @[256px]/no-image:text-2xl\">\n        {t('noPhotoAvailable')}\n      </span>\n    </div>\n  );\n};\n","import { useState } from 'react';\nimport type { ImageProps } from 'next/legacy/image';\nimport Image from 'next/legacy/image';\nimport { CarouselNoImage } from './carousel-no-image';\nimport { Caption } from '@dx-ui/osc-caption';\nimport type { CaptionProps } from '@dx-ui/osc-caption';\nimport classnames from 'classnames';\nimport { ANALYTICS_GLOBAL_CLICK_EVENT, trackEvent } from '@dx-ui/config-metrics';\nimport type { CarouselSingleMetrics } from './types/carousel-analytics';\n\nexport type CarouselImageProps = {\n  /** Image alt text. Defaults to \"Image showcasing selected Hotel\" */\n  alt?: string | null;\n  /** Pass in overrides for next/image component */\n  imageProps?: Omit<ImageProps, 'src'>;\n  /** source of image */\n  url: string;\n  captionData?: CaptionProps;\n  /** Whether it is the currently active image */\n  isActive?: boolean;\n  /** Analytics data */\n  metrics?: CarouselSingleMetrics;\n};\n\n/**\n * Component to render the carousel image. Includes error handling that will return a \"no photo available\" placeholder\n * in case of image error.\n * @returns JSX.Element\n */\nexport const CarouselImage = ({\n  alt,\n  imageProps,\n  url,\n  captionData,\n  isActive,\n  metrics,\n}: CarouselImageProps) => {\n  const [isImageError, setIsImageError] = useState(false);\n  const [isImageLoaded, setIsImageLoaded] = useState(false);\n\n  return (\n    <>\n      <div\n        className={classnames('absolute inset-0 size-full shrink-0 bg-text/10', {\n          'animate-pulse': !isImageLoaded,\n        })}\n      />\n      {isImageError ? (\n        <CarouselNoImage isFullSize />\n      ) : (\n        <figure className=\"relative size-full\">\n          <Image\n            alt={alt || ''}\n            className={classnames('absolute inset-0 size-full object-cover duration-500', {\n              'opacity-0': !isImageLoaded,\n              'opacity-100': isImageLoaded,\n            })}\n            layout=\"fill\"\n            onError={() => {\n              setIsImageError(true);\n            }}\n            onLoadingComplete={() => {\n              setIsImageLoaded(true);\n            }}\n            src={url}\n            unoptimized={true}\n            data-testid=\"carousel-image\"\n            aria-hidden={isActive ? 'false' : 'true'}\n            {...imageProps}\n          />\n          {captionData && isActive ? (\n            <Caption\n              caption={captionData?.caption}\n              captionLink={captionData?.captionLink}\n              metricsOnClick={() => metrics && trackEvent(ANALYTICS_GLOBAL_CLICK_EVENT, metrics)}\n            />\n          ) : null}\n        </figure>\n      )}\n    </>\n  );\n};\n","import {\n  ANALYTICS_NO_VALUE,\n  type BaseImageMetrics,\n  ImageClickID,\n  type ImageClickIDType,\n  ImageFunction,\n  ImageType,\n} from '@dx-ui/config-metrics';\nimport type { CarouselSingleMetrics } from '../types/carousel-analytics';\n\ntype GenerateCarouselSingleMetricsParams = {\n  metrics?: Partial<BaseImageMetrics>;\n  position?: number;\n  images?: { alt: string }[];\n  itemTitle?: string;\n  clickID: ImageClickIDType;\n  imageFunction?: (typeof ImageFunction)['Link'];\n};\n\n/**\n * Utility function to generate carousel metrics\n */\nexport function generateCarouselSingleMetrics({\n  metrics,\n  position,\n  images,\n  itemTitle = ANALYTICS_NO_VALUE,\n  clickID = ImageClickID.Scroll,\n  imageFunction,\n}: GenerateCarouselSingleMetricsParams): CarouselSingleMetrics {\n  const carouselMetrics = {\n    click: {\n      ...metrics?.click,\n      clickID,\n    },\n    osc: {\n      ...metrics?.osc,\n      image: {\n        ...metrics?.osc?.image,\n        headline: metrics?.osc?.image?.headline || ANALYTICS_NO_VALUE,\n        count: images?.length || 0,\n        position: position || 0,\n        itemTitle: itemTitle || ANALYTICS_NO_VALUE,\n        type: ImageType.Carousel,\n      },\n    },\n  };\n\n  if (imageFunction === ImageFunction.Link) {\n    carouselMetrics.osc.image = {\n      ...carouselMetrics.osc.image,\n      function: ImageFunction.Link,\n    };\n  }\n\n  return carouselMetrics;\n}\n\n/**\n * Utility function to generate CPM carousel metrics\n * The returned object will serve as a partial image metric object to be extended within the CarouselSingle component\n */\nexport function generateCpmCarouselMetrics(\n  headline: string | null | undefined,\n  clickID?: ImageClickIDType\n): Partial<BaseImageMetrics> {\n  return {\n    click: {\n      clickID: clickID ?? ImageClickID.Img,\n    },\n    osc: {\n      image: {\n        // All the other CarouselSingleMetrics attributes will be set in CarouselSingle\n        headline: headline || ANALYTICS_NO_VALUE,\n        type: ImageType.Carousel,\n      },\n    },\n  };\n}\n","import cx from 'classnames';\nimport type * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport type { CaptionProps } from '@dx-ui/osc-caption';\nimport { Icon } from '@dx-ui/osc-icon';\nimport type { TFunction } from 'i18next';\nimport { CarouselImage } from './carousel-image';\nimport { CarouselNoImage } from './carousel-no-image';\nimport { useRect } from '@dx-ui/utilities-use-rect';\nimport { isRtl as isRtlLanguage } from '@dx-ui/utilities-get-language-direction';\nimport { useRouter } from 'next/router';\nimport {\n  ANALYTICS_GLOBAL_CLICK_EVENT,\n  ANALYTICS_NO_VALUE,\n  type BaseImageMetrics,\n  ImageClickID,\n  ImageFunction,\n  trackEvent,\n} from '@dx-ui/config-metrics';\nimport { generateCarouselSingleMetrics } from './utils/carousel-analytics';\n\nexport type CarouselImages = {\n  alt: string;\n  url: string;\n  captionData?: CaptionProps;\n  children?: React.ReactNode;\n};\n\nexport type CarouselSinglePropsBase = {\n  images?: CarouselImages[];\n  startingIndex?: number;\n  isLoading?: boolean;\n  onArrowClick?: (index: number) => void;\n  showAlternateControls?: boolean;\n  isTailored?: boolean;\n  metrics?: Partial<BaseImageMetrics>;\n};\n\nexport type CarouselSingleProps = CarouselSinglePropsBase & React.HTMLAttributes<HTMLDivElement>;\n\nconst CarouselNavigationButton = ({\n  children,\n  direction,\n  isTailored,\n  ...rest\n}: {\n  children: React.ReactNode;\n  direction: 'left' | 'right';\n  isTailored?: CarouselSinglePropsBase['isTailored'];\n} & React.HTMLAttributes<HTMLButtonElement>) => (\n  <button\n    className=\"relative flex appearance-none items-center overflow-hidden\"\n    type=\"button\"\n    {...rest}\n  >\n    {children}\n    <span\n      className={cx({\n        '@[256px]/carousel:px-2 py-2 px-1 bg-bg-inverse opacity-90': !isTailored,\n        'bg-[rgb(var(--theme-colors-main))] p-2 md:p-3': isTailored,\n      })}\n    >\n      <Icon\n        name=\"arrowhead-left\"\n        className={cx('h-3 w-5 @[256px]/carousel:size-7 @[448px]/carousel:size-8', {\n          '-scale-x-100': direction === 'right',\n          'fill-text': isTailored,\n          'fill-text-inverse': !isTailored,\n        })}\n      />\n    </span>\n  </button>\n);\n\nconst CarouselControls = ({\n  showAlternateControls,\n  activeIndex,\n  count,\n  isRtl = false,\n  isTailored = false,\n  handlePreviousButtonClick,\n  handleNextButtonClick,\n  t,\n}: {\n  isRtl: boolean;\n  isTailored?: CarouselSinglePropsBase['isTailored'];\n  showAlternateControls?: boolean;\n  count: number;\n  activeIndex: number;\n  handlePreviousButtonClick: () => void;\n  handleNextButtonClick: () => void;\n  t: TFunction<'osc-carousel'>;\n}) => {\n  const leftNav = (\n    <CarouselNavigationButton\n      data-testid=\"previousCarouselImage\"\n      direction={isRtl ? 'right' : 'left'}\n      onClick={handlePreviousButtonClick}\n      isTailored={isTailored}\n    >\n      <span className=\"sr-only\">{t('previousImage')}</span>\n    </CarouselNavigationButton>\n  );\n\n  const rightNav = (\n    <CarouselNavigationButton\n      data-testid=\"nextCarouselImage\"\n      direction={isRtl ? 'left' : 'right'}\n      onClick={handleNextButtonClick}\n      isTailored={isTailored}\n    >\n      <span className=\"sr-only\">{t('nextImage')}</span>\n    </CarouselNavigationButton>\n  );\n\n  const paginationCounter = showAlternateControls ? (\n    <>\n      <p\n        aria-hidden\n        className={cx('select-none overflow-hidden text-xs @[256px]/carousel:text-base', {\n          'bg-[rgb(var(--theme-colors-main))] p-2.5 md:p-4 text-xs tracking-wide font-semibold':\n            isTailored,\n          'text-text-inverse': !isTailored,\n        })}\n      >\n        {activeIndex + 1} / {count}\n      </p>\n      <span className=\"sr-only\" aria-live=\"polite\">\n        {t('imageCount', { activeIndex: activeIndex + 1, imageCount: count })}\n      </span>\n    </>\n  ) : (\n    <>\n      <p\n        data-osc-product=\"carousel-label\"\n        aria-hidden\n        className=\"absolute bottom-0 right-0 flex select-none items-center overflow-hidden bg-bg-inverse px-2 py-1 text-xs text-text-inverse opacity-90 @[256px]/carousel:text-sm @[448px]/carousel:text-base rtl:left-0 rtl:right-auto\"\n      >\n        {activeIndex + 1} / {count}\n      </p>\n      <span className=\"sr-only\" aria-live=\"polite\">\n        {t('imageCount', { activeIndex: activeIndex + 1, imageCount: count })}\n      </span>\n    </>\n  );\n\n  return showAlternateControls ? (\n    <div\n      data-testid=\"testAlternateControlClassName\"\n      className={cx('absolute flex', {\n        'bottom-0 right-10 opacity-90 bg-bg-inverse items-center': !isTailored,\n        'bottom-1 right-1 md:bottom-4 md:right-4 gap-0.5 justify-evenly items-stretch': isTailored,\n      })}\n    >\n      {isTailored ? (\n        <>\n          {leftNav}\n          {rightNav}\n          {paginationCounter}\n        </>\n      ) : (\n        <>\n          {leftNav}\n          {paginationCounter}\n          {rightNav}\n        </>\n      )}\n    </div>\n  ) : (\n    <>\n      {paginationCounter}\n      <div className=\"absolute inset-y-1/2 flex w-full items-center justify-between\">\n        {leftNav}\n        {rightNav}\n      </div>\n    </>\n  );\n};\n\n/**\n *\n * A carousel that displays a single image at a time. Includes a built in loading (shimmer) and error handling state\n * @returns JSX.element\n */\nexport const CarouselSingle = ({\n  className,\n  images,\n  startingIndex = 0,\n  onArrowClick,\n  isLoading = false,\n  showAlternateControls,\n  isTailored = false,\n  metrics,\n  ...rest\n}: CarouselSingleProps) => {\n  const { t } = useTranslation('osc-carousel');\n  const { locale = 'en' } = useRouter();\n  const isRtl = isRtlLanguage(locale);\n  const [activeIndex, setActiveIndex] = useState(startingIndex);\n  const [touchStart, setTouchStart] = useState(0);\n  const [touchEnd, setTouchEnd] = useState(0);\n  const ref = useRef<HTMLDivElement | null>(null);\n\n  const count = images?.length ?? 0;\n\n  const rect = useRect({ ref: count > 0 ? ref : { current: null } });\n\n  const width = rect?.width ?? 0;\n  const height = rect?.height ?? 0;\n  const imageTranslateX = `${!isRtl ? '-' : ''}${\n    activeIndex === 0 ? 0 : 100 / (count / activeIndex)\n  }%`;\n\n  const handleNextButtonClick = () => {\n    const newIndex = images && activeIndex === images.length - 1 ? 0 : activeIndex + 1;\n    if (onArrowClick) onArrowClick(newIndex);\n    setActiveIndex(newIndex);\n\n    trackEvent(\n      ANALYTICS_GLOBAL_CLICK_EVENT,\n      generateCarouselSingleMetrics({\n        metrics,\n        images,\n        clickID: ImageClickID.Scroll,\n        itemTitle:\n          images?.[activeIndex]?.captionData?.caption ||\n          images?.[activeIndex]?.alt ||\n          ANALYTICS_NO_VALUE,\n        position: activeIndex + 1, // 1-based index\n      })\n    );\n  };\n  const handlePreviousButtonClick = () => {\n    const newIndex = images && activeIndex === 0 ? images.length - 1 : activeIndex - 1;\n    if (onArrowClick) onArrowClick(newIndex);\n    setActiveIndex(newIndex);\n\n    trackEvent(\n      ANALYTICS_GLOBAL_CLICK_EVENT,\n      generateCarouselSingleMetrics({\n        metrics,\n        images,\n        clickID: ImageClickID.Scroll,\n        itemTitle:\n          images?.[activeIndex]?.captionData?.caption ||\n          images?.[activeIndex]?.alt ||\n          ANALYTICS_NO_VALUE,\n        position: activeIndex + 1, // 1-based index\n      })\n    );\n  };\n\n  const handleTouchStart = (e: React.TouchEvent<HTMLDivElement>) => {\n    e.stopPropagation();\n    setTouchStart(e.targetTouches[0]?.clientX ?? 0);\n  };\n  const handleTouchMove = (e: React.TouchEvent<HTMLDivElement>) => {\n    setTouchEnd(e.targetTouches[0]?.clientX ?? 0);\n  };\n  const handleTouchEnd = () => {\n    //swipe sensitivity can be adjusted - travel distance in [number] pixels of user swipe event\n    const SWIPE_SENSITIVITY = 50;\n    //swipe left\n    if (touchStart - touchEnd > SWIPE_SENSITIVITY && touchEnd > 0) handleNextButtonClick();\n    //swipe right\n    if (touchStart - touchEnd < -SWIPE_SENSITIVITY && touchEnd > 0) handlePreviousButtonClick();\n\n    setTouchStart(0);\n    setTouchEnd(0);\n  };\n\n  /** If content of gallery is loading present shimmer state to prevent CLS */\n  if (isLoading)\n    return (\n      <div\n        className={cx(\n          'relative aspect-[3/2] w-full animate-pulse overflow-hidden bg-bg-alt',\n          className\n        )}\n        data-testid=\"singleImageCarouselLoading\"\n        ref={ref}\n        {...rest}\n      />\n    );\n\n  /** No images are available return placeholder with message */\n  if (!images || !count) {\n    return <CarouselNoImage className={className} />;\n  }\n\n  return (\n    <div\n      className={cx('relative aspect-[3/2] w-full overflow-hidden @container/carousel', className)}\n      onTouchEnd={handleTouchEnd}\n      onTouchMove={handleTouchMove}\n      onTouchStart={handleTouchStart}\n      ref={ref}\n      {...rest}\n    >\n      <div\n        className=\"relative flex select-none overflow-hidden transition duration-500 ease-out-quint\"\n        data-testid=\"singleImageCarousel\"\n        style={{\n          height,\n          width: `${count * 100}%`,\n          transform: `translate3d(${imageTranslateX}, 0, 0)`,\n        }}\n      >\n        {images?.map((imageProps, index) => (\n          <div\n            className=\"relative size-full overflow-hidden bg-bg-alt\"\n            key={`carousel-image-${imageProps.url}`}\n            style={{ width }}\n            data-testid={`image-carousel-wrap-${index + 1}`}\n          >\n            <CarouselImage\n              isActive={index === activeIndex}\n              {...imageProps}\n              imageProps={{ priority: index === 0 }}\n              metrics={generateCarouselSingleMetrics({\n                metrics,\n                position: index + 1, // 1-based index\n                images,\n                itemTitle: imageProps?.captionData?.caption || ANALYTICS_NO_VALUE,\n                clickID: ImageClickID.Img,\n                imageFunction: ImageFunction.Link,\n              })}\n            />\n            {imageProps.children ? <div>{imageProps.children}</div> : null}\n          </div>\n        ))}\n      </div>\n      {/* Only show carousel controls/count if we have more than 1 image passed in */}\n      {count > 1 ? (\n        <CarouselControls\n          handleNextButtonClick={handleNextButtonClick}\n          handlePreviousButtonClick={handlePreviousButtonClick}\n          count={count}\n          t={t}\n          activeIndex={activeIndex}\n          showAlternateControls={showAlternateControls}\n          isTailored={isTailored}\n          isRtl={isRtl}\n        />\n      ) : null}\n    </div>\n  );\n};\n\nexport default CarouselSingle;\n","export * from './lib/carousel-single';\nexport * from './lib/carousel-no-image';\nexport * from './lib/carousel-image';\nexport * from './lib/utils/carousel-analytics';\nexport * from './lib/types/carousel-analytics';\n"],"names":["isLocalCurrencySameAsHotelCurrency","selectedCurrency","hotelCurrency","getButtonLabels","t","isAdultsOnly","isNoResEnabled","AVAILABLE","MAY_BE_AVAILABLE","NOT_OPEN","NOT_AVAILABLE","getPreAvailabilityText","isPreSell","openDate","preOpenMsg","comingSoonAndSoldOutCaption","caption","comingSoonAndSoldOutMessage","message","preSellDate","preOpenDate","getSoldOutOrUnavailableText","isOccupancyExceeded","numChildren","occupants","undefined","numGuests","count","getAvailabilityText","isPreOpen","isSoldOut","isIndividualRoomsOnly","args","getPreSellPreOpenInfo","language","isHotelPreOpen","resEnabled","preSell","Date","preOpen","isAfter","isResPreSell","isNoResPreOpen","preSellDateFmt","getUTCFullYear","getUTCMonth","getUTCDate","toLocaleDateString","dateStyle","preOpenDateFmt","year","month","className","hasColumnLayout","isCaption","isCompare","textType","type","textClassName","numOfChildren","usePoints","isDateFlex","hasSpecialRate","allowAdultsOnly","priceInfo","summary","status","statusCode","hasConfidentialRate","lowest","ratePlan","confidentialRates","lengthOfStay","pointsAvailable","hhonors","dailyRmPointsRateFmt","isDiamondRate","specialRateType","rateMessage","ratePlanName","hasRateChange","Boolean","rateChangeIndicator","showDisplayFeeTransparencySubMsg","cmaTotalPriceIndicator","feeTransparencyIndicator","isAgeBasedPricing","ageBasedPricing","queryParameters","numRooms","INDIVIDUAL_ROOMS_MPA_STATUS_CODE","INDIVIDUAL_ROOMS_MAX","getLeadRateAvailStatus","display","leadRate","open","getHotelLeadRateInfo","hotelData","locale","ctyhocn","hasConnectingRooms","currenciesError","currenciesMap","pageType","availStatus","resEnabledDate","href","generateCTAFunnelUrl","host","env","HONORS_HOST","shouldUsePoints","currencyCode","isPointsExplorer","isDreams","lang","convertedPrice","localization","rateAmountFmt","formatAndConvertPrice","basePrice","rateAmount","currencyQueryError","fromCurrency","get","toCurrency","points","lead","dailyRmPointsRateNumFmt","disclaimerMessages","amexDisclaimer","isResorts","amex","disclaimers","length","find","disclaimer","AMEX_EXCEPTION_CTYHOCN","desc","push","heading","text","rate","ratePlanDesc","buttonLabel","isNewHotel","amenities","amenity","id","amenityIds","tripAdvisorLocationSummary","messages","hotelName","name","prefix","suffix","infoIconOrPopup","align","infoText","displayFeeTransparencySubMsg","customParams","showCompare","ctaLabel","ctaHref","CarouselNoImage","isFullSize","useTranslation","div","cx","span","CarouselImage","alt","imageProps","url","captionData","isActive","metrics","isImageError","setIsImageError","useState","isImageLoaded","setIsImageLoaded","classnames","figure","Image","layout","onError","onLoadingComplete","src","unoptimized","data-testid","aria-hidden","Caption","captionLink","metricsOnClick","trackEvent","ANALYTICS_GLOBAL_CLICK_EVENT","generateCarouselSingleMetrics","position","images","itemTitle","ANALYTICS_NO_VALUE","clickID","ImageClickID","Scroll","imageFunction","carouselMetrics","click","osc","image","headline","ImageType","Carousel","ImageFunction","Link","function","CarouselNavigationButton","children","direction","isTailored","rest","button","Icon","CarouselControls","showAlternateControls","activeIndex","isRtl","handlePreviousButtonClick","handleNextButtonClick","leftNav","onClick","rightNav","paginationCounter","p","aria-live","imageCount","data-osc-product","CarouselSingle","startingIndex","onArrowClick","isLoading","useRouter","isRtlLanguage","setActiveIndex","touchStart","setTouchStart","touchEnd","setTouchEnd","ref","useRef","rect","useRect","current","width","height","imageTranslateX","newIndex","onTouchEnd","handleTouchEnd","SWIPE_SENSITIVITY","onTouchMove","e","handleTouchMove","targetTouches","clientX","onTouchStart","handleTouchStart","stopPropagation","style","transform","map","index","priority","Img"],"sourceRoot":"","ignoreList":[]}