{"version":3,"file":"static/chunks/892-fc1e2a6de5f2348a.js","mappings":"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","sources":["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 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 '@container/no-image bg-bg-alt flex items-center justify-center',\n { 'h-full w-full': isFullSize, 'aspect-[3/2]': !isFullSize },\n className\n )}\n >\n <span className=\"@[256px]/no-image:text-2xl @[150px]/no-image:text-base text-text-alt text-xs\">\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('bg-text/10 absolute inset-0 size-full shrink-0', {\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","/* eslint-disable react/display-name */\nimport 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(--color-background))] p-2 md:p-3': isTailored,\n })}\n >\n <Icon\n name=\"arrowhead-left\"\n className={cx('@[256px]/carousel:size-7 @[448px]/carousel:size-8 h-3 w-5', {\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('@[256px]/carousel:text-base select-none overflow-hidden text-xs', {\n 'bg-[rgb(var(--color-background))] 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=\"bg-bg-inverse text-text-inverse @[256px]/carousel:text-sm @[448px]/carousel:text-base absolute bottom-0 right-0 flex select-none items-center overflow-hidden px-2 py-1 text-xs opacity-90 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 'bg-bg-alt relative aspect-[3/2] w-full animate-pulse overflow-hidden',\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('@container/carousel relative aspect-[3/2] w-full overflow-hidden', className)}\n onTouchEnd={handleTouchEnd}\n onTouchMove={handleTouchMove}\n onTouchStart={handleTouchStart}\n ref={ref}\n {...rest}\n >\n <div\n className=\"ease-out-quint relative flex select-none overflow-hidden transition duration-500\"\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=\"bg-bg-alt relative size-full overflow-hidden\"\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":["CarouselNoImage","className","isFullSize","useTranslation","t","div","cx","span","CarouselImage","alt","imageProps","url","captionData","isActive","metrics","useState","isImageError","setIsImageError","isImageLoaded","setIsImageLoaded","classnames","figure","Image","layout","onError","onLoadingComplete","src","unoptimized","data-testid","aria-hidden","Caption","caption","captionLink","metricsOnClick","trackEvent","ANALYTICS_GLOBAL_CLICK_EVENT","generateCarouselSingleMetrics","position","images","itemTitle","ANALYTICS_NO_VALUE","clickID","ImageClickID","Scroll","imageFunction","carouselMetrics","click","osc","image","headline","count","length","type","ImageType","Carousel","ImageFunction","Link","function","CarouselNavigationButton","children","direction","isTailored","rest","button","Icon","name","CarouselControls","showAlternateControls","activeIndex","isRtl","handlePreviousButtonClick","handleNextButtonClick","leftNav","onClick","rightNav","paginationCounter","p","aria-live","imageCount","data-osc-product","CarouselSingle","rect","startingIndex","onArrowClick","isLoading","useRouter","locale","isRtlLanguage","setActiveIndex","touchStart","setTouchStart","touchEnd","setTouchEnd","ref","useRef","useRect","current","width","height","imageTranslateX","newIndex","onTouchEnd","handleTouchEnd","SWIPE_SENSITIVITY","onTouchMove","handleTouchMove","e","targetTouches","clientX","onTouchStart","handleTouchStart","stopPropagation","style","transform","map","index","priority","Img"],"sourceRoot":"","ignoreList":[]}