{"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":[]}