{"version":3,"file":"static/chunks/9940-01f8363b6ea87e88.js","mappings":"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","sources":["webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/dynamic-grid-image.tsx","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/utils/dynamic-grid-analytics.ts","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/dynamic-grid-item.tsx","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/utils/dynamic-grid-column-count.ts","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/dynamic-grid.tsx","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/dynamic-grid-item-wom.tsx","webpack://_N_E/../../libs/utilities/use-has-overflow/src/lib/use-has-overflow.ts","webpack://_N_E/../../libs/utilities/use-has-overflow/src/lib/index.ts","webpack://_N_E/../../libs/utilities/use-has-overflow/src/index.ts","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/dynamic-grid-wom.tsx","webpack://_N_E/../../libs/osc/dynamic-grids/src/lib/index.ts","webpack://_N_E/../../libs/osc/dynamic-grids/src/index.ts","webpack://_N_E/../../libs/osc/textual-block/src/lib/textual-block.tsx","webpack://_N_E/../../libs/osc/textual-block/src/lib/index.ts","webpack://_N_E/../../libs/osc/textual-block/src/index.ts","webpack://_N_E/../../libs/osc/animate-reveal-item/src/lib/animate-reveal-item.tsx","webpack://_N_E/../../libs/osc/animate-reveal-item/src/lib/index.ts","webpack://_N_E/../../libs/osc/animate-reveal-item/src/index.ts"],"sourcesContent":["import { ResponsiveImage, ResponsivePicture } from '@dx-ui/osc-responsive-image';\nimport type { TResponsiveImage, TResponsivePicture } from '@dx-ui/osc-responsive-image';\n\nexport type DynamicImageProps = Pick<\n TResponsiveImage,\n 'id' | 'imageUrl' | 'altText' | 'aspectRatio' | 'width' | 'captionData' | 'className'\n> &\n Pick<\n TResponsivePicture,\n 'tabletAspectRatio' | 'mobileAspectRatio' | 'tabletImageUrl' | 'mobileImageUrl'\n >;\n\nexport const DynamicImage: React.FC<DynamicImageProps> = ({\n id,\n imageUrl,\n altText,\n aspectRatio,\n tabletAspectRatio,\n mobileAspectRatio,\n tabletImageUrl,\n mobileImageUrl,\n width,\n captionData,\n className,\n}) => {\n const sharedProps = {\n id: `dynamic-grid-wom-item-img-${id}`,\n aspectRatio,\n imageUrl,\n altText,\n width,\n captionData,\n className,\n };\n\n return tabletImageUrl || mobileImageUrl ? (\n <ResponsivePicture\n {...sharedProps}\n tabletAspectRatio={tabletAspectRatio}\n mobileAspectRatio={mobileAspectRatio}\n tabletImageUrl={tabletImageUrl}\n mobileImageUrl={mobileImageUrl}\n />\n ) : (\n <ResponsiveImage {...sharedProps} />\n );\n};\n","import {\n type ImageFunctionType,\n ANALYTICS_NO_VALUE,\n type BaseImageMetrics,\n ImageClickID,\n ImageFunction,\n ImageType,\n} from '@dx-ui/config-metrics';\nimport type { DynamicGridMetrics } from '../types/dynamic-grid-analytics';\n\ntype GenerateDynamicGridMetricsParams = {\n metrics?: Partial<BaseImageMetrics>;\n position: number;\n count?: number;\n itemTitle?: string;\n headline?: string;\n imageType?: (typeof ImageType)['Dynamic'];\n imageFunction?: ImageFunctionType;\n};\n\n/**\n * Utility function to generate dynamic Grid metrics\n */\nexport function generateDynamicGridMetrics({\n metrics,\n position,\n count = 0,\n itemTitle = ANALYTICS_NO_VALUE,\n headline = ANALYTICS_NO_VALUE,\n imageFunction = ImageFunction.Modal, // 'Modal' for Dynamic Grid, 'Link' for Dynamic Grid WOM\n}: GenerateDynamicGridMetricsParams): DynamicGridMetrics {\n const DynamicGridMetrics = {\n click: {\n clickID: ImageClickID.Img,\n },\n osc: {\n ...metrics?.osc,\n image: {\n ...metrics?.osc?.image,\n count,\n itemTitle,\n type: ImageType.Dynamic,\n headline: metrics?.osc?.image?.headline || headline,\n position,\n function: imageFunction,\n },\n },\n };\n\n return DynamicGridMetrics;\n}\n\n/**\n * Utility function to generate Dynamic Grid metrics\n * The returned object will serve as a partial image metric object to be extended within the Dynamic Grid component\n */\nexport function generatePartialDynamicGridMetrics(\n headline: string | null | undefined\n): Partial<BaseImageMetrics> {\n return {\n click: {\n clickID: ImageClickID.Img,\n },\n osc: {\n image: {\n // All the other DynamicGridMetrics attributes will be set in DynamicGridItem\n headline: headline || ANALYTICS_NO_VALUE,\n type: ImageType.Dynamic,\n },\n },\n };\n}\n","import { useRef } from 'react';\nimport cx from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { useRect } from '@dx-ui/utilities-use-rect';\nimport { DynamicImage } from './dynamic-grid-image';\nimport type { AspectRatio } from '@dx-ui/osc-responsive-image';\nimport type { CaptionProps } from '@dx-ui/osc-caption';\nimport type { Link } from '@dx-ui/osc-link';\nimport type { VariantTypes } from './dynamic-grid';\nimport {\n trackEvent,\n ANALYTICS_GLOBAL_CLICK_EVENT,\n type BaseImageMetrics,\n} from '@dx-ui/config-metrics';\nimport { generateDynamicGridMetrics } from './utils/dynamic-grid-analytics';\n\nexport type TDynamicGridItem = {\n /** Dynamic Grid item id */\n id: string;\n /** Image for Dynamic Grid Item */\n imageUrl: string;\n tabletImageUrl?: string;\n mobileImageUrl?: string;\n /** Alt Text for Dynamic Grid Item Image */\n imageAltTxt: string;\n /** Image for Displaying in Modal */\n modalImageUrl?: string;\n /** Alt text for Modal Image */\n modalImageAltText?: string;\n /** Text overlaid on Dynamic Grid Item */\n itemTitle?: string;\n /** Headline for Dynamic Grid Item Modal/dialog */\n headline?: string;\n /** Content such as Markdown, or text in Modal/dialog */\n shortDescription?: JSX.Element | string;\n /** Link following the item headline & content in Modal/dialog */\n link?: React.ComponentProps<typeof Link> & {\n experimentationConfiguration?: CmsExperimentationConfiguration;\n };\n /** Callback handler for grid item click event */\n onItemClick?: (id: string, el: HTMLButtonElement | null) => void;\n /** Callback handler for link click event */\n onClickLink?: (id?: string) => void;\n /** Add Tailwind classes to root element */\n className?: string;\n /** Caption link and text */\n captionData?: CaptionProps;\n /** List of Audience Ids */\n segmentIds: string[];\n /** CMS document editor button **/\n cmsDocumentControl?: React.ReactNode;\n /* Translation CSS classes to add to each item */\n cmsTranslationClasses?: string;\n /* CPM controlled brand color themes */\n brandComponentTheme?: CmsBrandComponentTheme;\n /** New card variant added for Enterprise refresh */\n variant?: VariantTypes;\n /** Headline for Dynamic Grid */\n listHeadline?: string;\n /** Position of the Dynamic Grid Item */\n position?: number;\n /** Number of Dynamic Grid Items */\n count?: number;\n /** Metrics object for analytics */\n metrics?: Partial<BaseImageMetrics>;\n};\n\nexport type TDynamicGridItemAndAspectRatios = TDynamicGridItem & {\n /** The aspect ratio for the grid item images */\n imageAspectRatio: AspectRatio;\n tabletImageAspectRatio?: AspectRatio;\n mobileImageAspectRatio?: AspectRatio;\n};\n\nexport const DocsTDynamicGridItem: React.FC<\n React.PropsWithChildren<TDynamicGridItemAndAspectRatios>\n> = () => null;\n\nconst DynamicGridItem: React.FC<TDynamicGridItemAndAspectRatios> = (item) => {\n const ref = useRef<React.ElementRef<'div'>>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const rect = useRect({ ref });\n const [t] = useTranslation('osc-dynamic-grids');\n\n const {\n id,\n captionData,\n itemTitle,\n imageUrl,\n tabletImageUrl,\n mobileImageUrl,\n onItemClick,\n className,\n variant,\n brandComponentTheme,\n position,\n count,\n listHeadline,\n headline,\n metrics,\n } = item;\n const aspectRatio = item?.imageAspectRatio;\n const tabletAspectRatio = item?.tabletImageAspectRatio;\n const mobileAspectRatio = item?.mobileImageAspectRatio;\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n const isCardLayout = variant === 'card';\n\n const onClickGridItem = () => {\n trackEvent(\n ANALYTICS_GLOBAL_CLICK_EVENT,\n generateDynamicGridMetrics({\n metrics,\n position: position || 0,\n count,\n itemTitle,\n headline: listHeadline || headline,\n })\n );\n onItemClick?.(id, buttonRef.current);\n };\n // TODO: NHCBP-3494 - Tailwind utitilies for grid-* classes (see grid.css)\n // TODO: NHCBP-3494 - Tailwind focus:ring utility not working - classNames on \"button\":\n // focus:ring-2 focus:ring-primary focus:ring-opacity-50\n\n const handleOnFocus = () => {\n // Scroll to the element when focused\n // The setTimeout is needed for this to work in Safari browser\n setTimeout(() => {\n buttonRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }, 10);\n };\n\n if (item) {\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n data-testid={`dynamicgrid-item-${id}`}\n id={id}\n onClick={onClickGridItem}\n className={cx(\n 'group overflow-y-hidden sm:w-auto',\n 'focus:ring-2 focus:ring-primary/50',\n 'snap snap-start',\n 'relative',\n item.cmsTranslationClasses,\n className\n )}\n onFocus={handleOnFocus}\n >\n <div\n className=\"relative overflow-hidden bg-bg-alt brand-hi-refresh:rounded-lg\"\n data-testid={`layout-${isCardLayout ? 'card' : 'default'}`}\n >\n {isCardLayout ? (\n <div className=\"absolute inset-0 z-10 bg-bg-inverse opacity-0 transition-opacity duration-300 group-hover:opacity-15 group-focus:opacity-15\" />\n ) : null}\n <div className={cx('absolute z-10 flex size-full items-end')}>\n <div\n className={cx('size-full from-bg-inverse to-transparent', {\n 'bg-gradient-to-t': !isCardLayout,\n })}\n >\n <div\n className={cx('flex size-full items-end duration-200 ease-in-out', {\n 'group-hover:-translate-y-1/3': !isCardLayout,\n })}\n >\n {!isCardLayout && (\n <div\n className={cx(\n 'dynamic-grid-item-header mx-auto w-full px-3 leading-tight sm:py-4 lg:py-6 xl:text-3xl'\n )}\n data-testid=\"dynamicgrid-item-btnText\"\n >\n {itemTitle}\n </div>\n )}\n <span className=\"sr-only\">{t('openModal')}</span>\n </div>\n </div>\n </div>\n <div ref={ref} className=\"relative\">\n <DynamicImage\n id={id}\n imageUrl={imageUrl}\n altText=\"\"\n aspectRatio={aspectRatio}\n tabletAspectRatio={tabletAspectRatio}\n mobileAspectRatio={mobileAspectRatio}\n tabletImageUrl={tabletImageUrl}\n mobileImageUrl={mobileImageUrl}\n width={rect?.width ?? 0}\n captionData={captionData}\n className=\"duration-300 ease-in-out brand-gu:group-hover:scale-110 brand-gu:group-hover:opacity-80\"\n />\n {isCardLayout && aspectRatio === '3:4' ? (\n <DynamicGridCardHeader\n ar={aspectRatio}\n isDark={isDark}\n isLight={isLight}\n itemTitle={itemTitle}\n />\n ) : null}\n </div>\n {isCardLayout && aspectRatio !== '3:4' ? (\n <DynamicGridCardHeader\n ar={aspectRatio}\n isDark={isDark}\n isLight={isLight}\n itemTitle={itemTitle}\n />\n ) : null}\n </div>\n {item.cmsDocumentControl}\n </button>\n );\n }\n\n return null;\n};\n\ntype DynamicGridCardHeaderProps = {\n ar: AspectRatio;\n isDark: boolean;\n isLight: boolean;\n itemTitle: string | undefined;\n};\n\nconst DynamicGridCardHeader = ({ ar, isDark, isLight, itemTitle }: DynamicGridCardHeaderProps) => {\n const baseClasses =\n 'mx-auto w-full px-3 py-0 min-h-20 flex items-center justify-center xl:text-xl leading-tight dynamic-grid-item-header';\n const positionClasses = ar === '3:4' ? 'absolute inset-x-0 bottom-0' : '';\n\n return (\n <div\n className={cx(baseClasses, positionClasses, {\n 'dynamic-grid-item-header-light': isLight,\n 'dynamic-grid-item-header-dark': isDark,\n 'bg-primary': !isDark && !isLight,\n })}\n data-testid=\"dynamicgrid-item-btnText\"\n >\n <span className=\"relative z-10\">{itemTitle}</span>\n </div>\n );\n};\n\nexport { DynamicGridItem };\nexport default DynamicGridItem;\n","export const getDynamicGridColumnCount = (columnCount: string | number, count: number) => {\n let is369 = false,\n is4x = false,\n is2x = false,\n isOther = false;\n\n if (columnCount === 'auto') {\n is369 = count % 3 === 0 || count === 5;\n is4x = !is369 && count > 2 && (count % 2 === 0 || count === 7);\n is2x = !is369 && (is4x || count % 2 === 0);\n isOther = !is369 && !is4x && !is2x;\n } else {\n is369 = columnCount === '3';\n is4x = columnCount === '4';\n is2x = columnCount === '2';\n }\n\n return { is369, is4x, is2x, isOther };\n};\n","import { useState } from 'react';\nimport cx from 'classnames';\nimport { DialogWithContent } from '@dx-ui/osc-marketing';\nimport { BrandTextBody } from '@dx-ui/osc-brand-text-body';\nimport { BrandTextHeader } from '@dx-ui/osc-brand-text-header';\nimport { AnimateRevealItem } from '@dx-ui/osc-animate-reveal-item';\nimport DynamicGridItem, { type TDynamicGridItem } from './dynamic-grid-item';\nimport type { AspectRatio } from '@dx-ui/osc-responsive-image';\nimport { mapTextAlignToClassname } from '@dx-ui/osc-textual-block';\nimport { type BaseImageMetrics } from '@dx-ui/config-metrics';\nimport { getDynamicGridColumnCount } from './utils/dynamic-grid-column-count';\n\ntype ListItemButtonElement = HTMLButtonElement | null;\nexport type VariantTypes = 'card';\n\nexport type TDynamicGrid = {\n id: string;\n /** An array of TDynamicGridItem objects */\n items: TDynamicGridItem[];\n /** The aspect ratio for the grid item images */\n imageAspectRatio: AspectRatio;\n tabletImageAspectRatio?: AspectRatio;\n mobileImageAspectRatio?: AspectRatio;\n /** The aspect ratio for the modal item image */\n modalImageAspectRatio?: AspectRatio;\n /** If true then vertically stack items for mobile, instead of horitzontally scrolling */\n isMobileVerticalStack?: boolean;\n /** Headline for Dynamic Grid */\n listHeadline?: string;\n /** Content as a component, such as Markdown, or text */\n listDescription?: JSX.Element | string;\n /** Text alignment for CMS controls */\n textAlign?: 'left' | 'right' | 'center';\n /** Add Tailwind classes to root element */\n className?: string;\n /** Dialog component requires ariaLabel */\n ariaLabel?: string;\n /** Callback handler for Read Message event */\n onViewItem?: (id: string) => void;\n /** Callback for modal state opening or closing */\n onToggleModal?: (isOpen: boolean) => void;\n /** Theme variable for dark/light theming */\n brandComponentTheme?: CmsBrandComponentTheme;\n /** Enables reveal animations */\n isAnimated?: boolean;\n /** New card variant added for Enterprise refresh */\n variant?: VariantTypes;\n metrics?: Partial<BaseImageMetrics>;\n /** Choose the number of grid columns */\n columnCount?: 'auto' | '2' | '3' | '4';\n};\n\nexport const gridWrapperClass =\n 'snap snap-x snap-px-4 snap-mandatory grid-wrapper grid gap-4 py-2 auto-cols-[85%] sm:w-full sm:grid-flow-row max-sm:overflow-x-visible max-sm:overflow-y-auto';\n\n/**\n * DynamicGrid creates a grid of items with an image and title that opens a modal when clicked. Grids with either be a 3x grid (item counts of 3, 5, 6, or 9) or a 4x grid (item counts of 4, 7, or 8).\n * Recommended grid item counts of 3 to 9.\n */\nexport const DynamicGrid: React.FC<TDynamicGrid> = ({\n imageAspectRatio,\n tabletImageAspectRatio,\n mobileImageAspectRatio,\n modalImageAspectRatio = '16:9',\n items: baseItems = [],\n isMobileVerticalStack = false,\n className = '',\n listHeadline,\n listDescription,\n textAlign = 'left',\n onViewItem,\n onToggleModal,\n isAnimated = false,\n id: dynamicGridId,\n brandComponentTheme,\n variant,\n metrics,\n columnCount = 'auto',\n ...props\n}) => {\n const [activeId, updateActiveId] = useState('');\n const [isModalOpen, updateModalOpen] = useState(false);\n const [activeListItem, setActiveListItem] = useState<ListItemButtonElement>();\n const items = baseItems?.filter((item) => Boolean(item));\n const count = items.length;\n\n if (!count) {\n return null;\n }\n\n const openModal = (id: string, el: ListItemButtonElement) => {\n updateActiveId(id);\n el && setActiveListItem(el);\n onToggleModal && onToggleModal(true);\n onViewItem && onViewItem(id);\n updateModalOpen(true);\n };\n const closeModal = () => {\n onToggleModal && onToggleModal(false);\n updateModalOpen(false);\n activeListItem && setTimeout(() => activeListItem.focus());\n };\n const activeItem: TDynamicGridItem | undefined =\n items?.find((i) => i.id === activeId) || items?.[0];\n\n const { is369, is4x, is2x, isOther } = getDynamicGridColumnCount(columnCount, count);\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return (\n <section>\n <div\n className={cx('container overflow-hidden py-8 max-sm:pe-0 xl:py-12', {\n [className]: !!className,\n })}\n data-testid=\"dynamicGridWrap\"\n id={dynamicGridId}\n >\n <div className=\"max-sm:pe-4\">\n {listHeadline && (\n <BrandTextHeader\n className={cx('dynamic-grid-header', mapTextAlignToClassname(textAlign), {\n '!text-text-inverse': isDark,\n '!dynamic-grid-header-light': isLight,\n })}\n >\n {listHeadline}\n </BrandTextHeader>\n )}\n {listDescription && (\n <BrandTextBody\n className={cx('dynamic-grid-description', mapTextAlignToClassname(textAlign), {\n 'text-text-inverse': isDark,\n '!dynamic-grid-descrption-light': isLight,\n })}\n brandComponentTheme={brandComponentTheme}\n {...props}\n >\n {listDescription}\n </BrandTextBody>\n )}\n </div>\n <div className=\"size-full\">\n <div\n data-testid=\"dynamicGridItemsWrap\"\n className={cx(\n gridWrapperClass,\n isMobileVerticalStack ? 'grid-flow-row grid-cols-1' : 'grid-flow-col',\n is369 ? 'sm:grid-cols-3' : null,\n is2x ? 'sm:grid-cols-2' : null,\n is4x ? 'sm:grid-cols-2 lg:grid-cols-4' : null,\n isOther ? 'sm:grid-cols-2 lg:grid-cols-4' : null\n )}\n tabIndex={-1}\n >\n {items.map((item: TDynamicGridItem, index) => (\n <AnimateRevealItem\n key={`dynamic-grid-item${item.id}`}\n delay={is369 ? 100 + (index % 3) * 100 : 100 + (index % 4) * 100}\n isAnimated={isAnimated}\n className={cx({\n 'max-sm:translate-y-0 max-sm:opacity-100': !isMobileVerticalStack,\n })}\n >\n <DynamicGridItem\n imageAspectRatio={imageAspectRatio}\n tabletImageAspectRatio={tabletImageAspectRatio}\n mobileImageAspectRatio={mobileImageAspectRatio}\n className=\"w-full sm:w-full\"\n onItemClick={openModal}\n variant={variant}\n brandComponentTheme={brandComponentTheme}\n listHeadline={listHeadline}\n position={index + 1}\n count={count}\n metrics={metrics}\n {...item}\n />\n </AnimateRevealItem>\n ))}\n {/* This div acts as a spacer on mobile which allows the final grid item to snap all the way to the beginning edge of the screen */}\n <div className=\"w-4 sm:hidden md:ms-6\" />\n </div>\n </div>\n\n <DialogWithContent\n id=\"dynamicGridModalOverlay\"\n ariaLabel={activeItem?.itemTitle ?? ''}\n containerAspectRatio={modalImageAspectRatio}\n imageAspectRatio={modalImageAspectRatio}\n imageUrl={activeItem?.modalImageUrl}\n imageAltText={activeItem?.imageAltTxt}\n title={activeItem?.itemTitle}\n headline={activeItem?.headline}\n content={activeItem?.shortDescription}\n link={activeItem?.link}\n isOpen={isModalOpen}\n onClose={closeModal}\n cmsTranslationClasses={activeItem?.cmsTranslationClasses}\n {...props}\n />\n </div>\n </section>\n );\n};\n\nexport default DynamicGrid;\n","/* eslint-disable react/jsx-no-useless-fragment */\nimport { useRef } from 'react';\nimport cx from 'classnames';\nimport { getIsReducedMotion } from '@dx-ui/utilities-accessibility';\nimport { BrandTextBody } from '@dx-ui/osc-brand-text-body';\nimport { useIntersectionObserver } from 'usehooks-ts';\nimport { DynamicImage } from './dynamic-grid-image';\nimport { Link } from '@dx-ui/osc-link';\nimport type { AspectRatio } from '@dx-ui/osc-responsive-image';\nimport type { TDynamicGridItem } from './dynamic-grid-item';\nimport { useRect } from '@dx-ui/utilities-use-rect';\nimport { HeadingLevel } from '@dx-ui/osc-heading-level';\nimport {\n type BaseImageMetrics,\n ANALYTICS_GLOBAL_CLICK_EVENT,\n ImageFunction,\n trackEvent,\n} from '@dx-ui/config-metrics';\nimport { generateDynamicGridMetrics } from './utils/dynamic-grid-analytics';\n\ntype TDynamicGridItemWithoutListeners = Omit<TDynamicGridItem, 'onItemClick' | 'onClickLink'>;\n\nexport type TDynamicGridItemWOM = TDynamicGridItemWithoutListeners & {\n /** fade-in text animations */\n isAnimated?: boolean;\n /** theme for the component `dark` or `light` */\n brandComponentTheme?: CmsBrandComponentTheme;\n metrics?: Partial<BaseImageMetrics>;\n};\n\nexport type TDynamicGridItemAndAspectRatiosWOM = TDynamicGridItemWOM & {\n /** The aspect ratio for the grid item images */\n imageAspectRatio: AspectRatio;\n tabletImageAspectRatio?: AspectRatio;\n mobileImageAspectRatio?: AspectRatio;\n};\n\nexport const DocsTDynamicGridItemWOM: React.FC<\n React.PropsWithChildren<TDynamicGridItemAndAspectRatiosWOM>\n> = () => null;\n\nconst DynamicGridItemWOM: React.FC<TDynamicGridItemAndAspectRatiosWOM> = (item) => {\n const ref = useRef<React.ElementRef<'div'>>(null);\n const rect = useRect({ ref });\n const gridItemRef = useRef<React.ElementRef<'div'>>(null);\n\n const {\n id,\n imageUrl,\n tabletImageUrl,\n mobileImageUrl,\n imageAltTxt,\n headline,\n link,\n captionData,\n brandComponentTheme,\n shortDescription,\n isAnimated,\n count,\n listHeadline,\n position,\n metrics,\n } = item;\n\n const aspectRatio = item?.imageAspectRatio;\n const tabletAspectRatio = item?.tabletImageAspectRatio;\n const mobileAspectRatio = item?.mobileImageAspectRatio;\n const { ref: intersectionRef } = useIntersectionObserver({\n threshold: [1],\n freezeOnceVisible: true,\n });\n const observedWrapper = !getIsReducedMotion() && isAnimated ? intersectionRef : null;\n const headlineId = `headline${id}`;\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n const onClick = () => {\n trackEvent(\n ANALYTICS_GLOBAL_CLICK_EVENT,\n generateDynamicGridMetrics({\n position: position || 0,\n count,\n itemTitle: headline,\n headline: listHeadline,\n imageFunction: ImageFunction.Link,\n metrics,\n })\n );\n };\n\n const handleLinkFocus = () => {\n // Scroll to the element when focused\n // The setTimeout is needed for this to work in Safari browser\n setTimeout(() => {\n gridItemRef.current?.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }, 10);\n };\n\n return (\n <>\n {item ? (\n <div\n className={cx(\n 'snap group relative flex h-full snap-start flex-col justify-between pb-5',\n item.cmsTranslationClasses\n )}\n data-testid={`dynamicgrid-wom-item-${id}`}\n key={id}\n ref={gridItemRef}\n >\n <div className=\"flex flex-col\">\n {headline && (\n <HeadingLevel\n headingLevelFallback={3}\n id={headlineId}\n data-testid={`dynamicgrid-wom-item-head-${id}`}\n data-osc-product=\"dynamic-grid-wom-item-headline\"\n className={cx('dynamic-grid-item-wom-header my-2', {\n '!text-text-inverse': isDark,\n 'dynamic-grid-item-wom-header-light': isLight,\n 'dynamic-grid-item-wom-header-no-desc': !shortDescription,\n })}\n >\n {headline}\n </HeadingLevel>\n )}\n\n <div ref={ref} className=\"order-first\">\n {imageUrl && (\n <DynamicImage\n id={id}\n imageUrl={imageUrl}\n altText={imageAltTxt}\n aspectRatio={aspectRatio}\n tabletAspectRatio={tabletAspectRatio}\n mobileAspectRatio={mobileAspectRatio}\n tabletImageUrl={tabletImageUrl}\n mobileImageUrl={mobileImageUrl}\n width={rect?.width ?? 0}\n captionData={captionData}\n className=\"image-corner-radius duration-300 ease-in-out brand-gu:group-hover:scale-110 brand-gu:group-hover:opacity-80\"\n />\n )}\n </div>\n <div className=\"mb-2\" ref={observedWrapper}>\n <div className=\"relative z-10 pb-4\">\n <BrandTextBody\n brandComponentTheme={brandComponentTheme}\n className=\"!py-0 sm:!text-base lg:!text-lg\"\n >\n {shortDescription || ''}\n </BrandTextBody>\n </div>\n </div>\n </div>\n\n {link?.label && link?.url ? (\n <Link\n className=\"dynamic-grid-item-wom-link-text\"\n anchorClassName={cx(\n \"inline-block decoration-2 after:absolute after:inset-0 after:z-0 after:content-[''] hover:decoration-4 focus:decoration-4\",\n 'dynamic-grid-item-wom-link-anchor',\n link.anchorClassName,\n {\n '!text-text-inverse hover:!text-text-inverse': isDark,\n 'dynamic-grid-item-wom-link-anchor-light': isLight,\n 'dynamic-grid-item-wom-link-anchor-default': !isLight && !isDark,\n }\n )}\n isNewWindow={link?.isNewWindow || false}\n url={link?.url}\n showNewWindowIcon={link?.isNewWindow || false}\n underline={false}\n data-testid={`dynamicgrid-wom-item-link-${id}`}\n cidParams={link?.cidParams}\n data-conductrics-goal={link.experimentationConfiguration?.goal}\n data-conductrics-value={link.experimentationConfiguration?.value}\n onFocus={handleLinkFocus}\n onClick={(e) => {\n if (link?.onClick) {\n link.onClick?.(e);\n }\n onClick();\n }}\n >\n <div className=\"relative inline\">\n {link.label}\n <div\n className={cx(\n 'absolute h-px w-full origin-bottom-left scale-x-100 duration-[250ms] ease-out group-hover:scale-x-0 group-hover:ease-out',\n 'dynamic-grid-item-wom-link-label',\n {\n 'dynamic-grid-item-wom-link-label-dark': isDark,\n }\n )}\n />\n </div>\n </Link>\n ) : null}\n {item.cmsDocumentControl}\n </div>\n ) : null}\n </>\n );\n};\n\nexport { DynamicGridItemWOM };\nexport default DynamicGridItemWOM;\n","/**\n * Shamelessly copied from https://www.robinwieruch.de/react-custom-hook-check-if-overflow/\n * with slight modifications.\n */\n\nimport { useLayoutEffect, useState } from 'react';\n\nexport const useHasOverflow = <T extends HTMLElement>(\n ref: React.RefObject<T>,\n onlyHorizontal = false,\n onlyVertical = false\n) => {\n const [isOverflow, setIsOverflow] = useState<boolean | undefined>(undefined);\n\n useLayoutEffect(() => {\n const { current } = ref;\n\n if (!current) return;\n\n const trigger = () => {\n const hasOverflowHorizontal =\n current?.scrollWidth && current?.clientWidth\n ? current.scrollWidth > current.clientWidth\n : false;\n\n const hasOverflowVertical =\n current?.scrollHeight && current?.clientHeight\n ? current.scrollHeight > current.clientHeight\n : false;\n\n if (onlyHorizontal) {\n setIsOverflow(hasOverflowHorizontal);\n return;\n }\n\n if (onlyVertical) {\n setIsOverflow(hasOverflowVertical);\n return;\n }\n\n setIsOverflow(hasOverflowHorizontal || hasOverflowVertical);\n };\n\n if ('ResizeObserver' in window) {\n new ResizeObserver(trigger).observe(current);\n }\n\n trigger();\n }, [onlyHorizontal, onlyVertical, ref]);\n\n return isOverflow;\n};\n","export * from './use-has-overflow';\n","export * from './lib';\n","import { useId, useRef } from 'react';\nimport type * as React from 'react';\nimport cx from 'classnames';\nimport { useIntersectionObserver } from 'usehooks-ts';\nimport { getIsReducedMotion } from '@dx-ui/utilities-accessibility';\nimport { BrandTextBody } from '@dx-ui/osc-brand-text-body';\nimport { BrandTextHeader } from '@dx-ui/osc-brand-text-header';\nimport { BrandLink } from '@dx-ui/osc-brand-buttons';\nimport type { TDynamicGrid } from './dynamic-grid';\nimport type { Link } from '@dx-ui/osc-link';\nimport DynamicGridItemWOM, { type TDynamicGridItemWOM } from './dynamic-grid-item-wom';\nimport { mapTextAlignToClassname } from '@dx-ui/osc-textual-block';\nimport { HeadingLevelProvider } from '@dx-ui/osc-heading-level';\nimport { useHasOverflow } from '@dx-ui/utilities-use-has-overflow';\nimport type { BaseImageMetrics } from '@dx-ui/config-metrics';\nimport { getDynamicGridColumnCount } from './utils/dynamic-grid-column-count';\nimport { gridWrapperClass } from './dynamic-grid';\n\ntype TDynamicGridWithoutListeners = Omit<TDynamicGrid, 'onViewItem' | 'onToggleModal'>;\n\nexport type TDynamicGridWOM = TDynamicGridWithoutListeners & {\n /** An array of TDynamicGridItem objects */\n items: TDynamicGridItemWOM[];\n /** */\n listSubheading?: string;\n /** Link CTA appears below component */\n link?: Link & { experimentationConfiguration?: CmsExperimentationConfiguration };\n /** */\n wrapperClassName?: string;\n /** When passed, appends metrics object to generateDynamicGrids in dynamic-grids-item-wom */\n metrics?: Partial<BaseImageMetrics>;\n /** Choose the number of grid columns */\n columnCount?: 'auto' | '2' | '3' | '4';\n};\n\nexport const DocsTDynamicGridWOM: React.FC<React.PropsWithChildren<TDynamicGridWOM>> = () => null;\n\n/**\n * Dynamic Grid With-Out-Modal (WOM) creates a grid of images with content underneath in either a 3x grid (item counts of 3, 5, 6, or 9) or a 4x grid (item counts of 4, 7, or 8).\n * Recommended grid item counts of 3 to 9.\n */\nexport const DynamicGridWOM: React.FC<TDynamicGridWOM & { brandCode?: string }> = ({\n imageAspectRatio,\n tabletImageAspectRatio,\n mobileImageAspectRatio,\n items: baseItems = [],\n isMobileVerticalStack = false,\n className = '',\n listHeadline,\n listSubheading,\n listDescription,\n textAlign = 'left',\n link,\n id,\n isAnimated = false,\n wrapperClassName,\n brandComponentTheme,\n metrics,\n columnCount = 'auto',\n ...props\n}) => {\n const { ref, isIntersecting: inView } = useIntersectionObserver({\n threshold: [0.15],\n freezeOnceVisible: true,\n });\n const observedWrapper = !getIsReducedMotion() && isAnimated ? ref : null;\n const items = baseItems?.filter((item) => Boolean(item));\n const hasLinks = items.some((item) => item.link);\n const count = items.length;\n const headerId = useId();\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const hasOverflow = useHasOverflow(scrollRef);\n const scrollSectionIsFocusable = hasOverflow && !hasLinks;\n\n if (!count) {\n return null;\n }\n\n const { is369, is4x, is2x, isOther } = getDynamicGridColumnCount(columnCount, count);\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return (\n <section ref={observedWrapper}>\n <div\n className={\n wrapperClassName ||\n cx(\n 'container overflow-hidden py-8 brand-wa:py-16 max-sm:pe-0 xl:py-12 brand-wa:xl:py-20',\n {\n [className]: !!className,\n }\n )\n }\n data-testid=\"dynamicGridWOM\"\n id={id}\n >\n <div className=\"dynamic-grid-wom-headline-wrapper max-sm:pe-4\">\n <div className=\"dynamic-grid-wom-headline\">\n {listHeadline ? (\n <BrandTextHeader\n className={cx(mapTextAlignToClassname(textAlign), 'dynamic-grid-wom-header', {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !inView && isAnimated,\n 'opacity-100 translate-y-0': inView && isAnimated,\n '!text-text-inverse': isDark,\n '!dynamic-grid-wom-header-light': isLight,\n })}\n id={`dynamic-grid-heading-${headerId}`}\n >\n {listHeadline}\n </BrandTextHeader>\n ) : null}\n\n {listSubheading ? (\n <span\n className={cx(mapTextAlignToClassname(textAlign), 'dynamic-grid-wom-subheader', {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !inView && isAnimated,\n 'delay-150 opacity-100 translate-y-0': inView && isAnimated,\n 'text-text-inverse': isDark,\n 'dynamic-grid-wom-header-light': isLight,\n })}\n >\n {listSubheading}\n </span>\n ) : null}\n </div>\n\n {listDescription ? (\n <BrandTextBody\n className={cx(`dynamic-grid-wom-description`, mapTextAlignToClassname(textAlign), {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !inView && isAnimated,\n 'delay-300 opacity-100 translate-y-0': inView && isAnimated,\n 'text-text-inverse': isDark,\n })}\n {...props}\n brandComponentTheme={brandComponentTheme}\n >\n {listDescription}\n </BrandTextBody>\n ) : null}\n </div>\n\n <div className=\"dynamic-grid-wom-grid-wrapper\">\n <div\n data-testid=\"dynamicGridItemsWrap\"\n className={cx(gridWrapperClass, {\n 'grid-flow-row grid-cols-1': isMobileVerticalStack,\n 'grid-flow-col': !isMobileVerticalStack,\n 'sm:grid-cols-3': is369,\n 'sm:grid-cols-2': is2x,\n 'sm:grid-cols-2 lg:grid-cols-4': is4x || isOther,\n 'text-text-inverse': isDark,\n 'dynamic-grid-wom-grid-wrap-light': isLight,\n })}\n tabIndex={scrollSectionIsFocusable ? 0 : -1}\n aria-labelledby={`dynamic-grid-heading-${headerId}`}\n ref={scrollRef}\n >\n <HeadingLevelProvider shouldIncreaseLevel={!!listHeadline}>\n {items.map((item, itemIndex) => (\n <DynamicGridItemWOM\n key={`dynamic-grid-item-wom${item.id}`}\n isAnimated={isAnimated}\n brandComponentTheme={brandComponentTheme}\n imageAspectRatio={imageAspectRatio}\n tabletImageAspectRatio={tabletImageAspectRatio}\n mobileImageAspectRatio={mobileImageAspectRatio}\n position={itemIndex + 1}\n listHeadline={listHeadline}\n count={count}\n metrics={metrics}\n {...item}\n />\n ))}\n </HeadingLevelProvider>\n {/* This div acts as a spacer on mobile which allows the final grid item to snap all the way to the beginning edge of the screen */}\n <div className=\"w-4 sm:hidden md:ms-6\" />\n </div>\n </div>\n {link?.adaDescription && link?.url && link?.label ? (\n <div className=\"relative flex w-full justify-center\">\n <BrandLink\n label={link.label}\n isNewWindow={link.isNewWindow}\n showNewWindowIcon={link.isNewWindow}\n url={link.url}\n brandComponentTheme={brandComponentTheme}\n data-conductrics-goal={link.experimentationConfiguration?.goal}\n data-conductrics-value={link.experimentationConfiguration?.value}\n />\n </div>\n ) : null}\n </div>\n </section>\n );\n};\n\nexport default DynamicGridWOM;\n","export * from './dynamic-grid';\nexport * from './dynamic-grid-wom';\nexport * from './dynamic-grid-item';\nexport * from './dynamic-grid-image';\nexport * from './dynamic-grid-item-wom';\nexport * from './utils/dynamic-grid-analytics';\nexport * from './utils/dynamic-grid-column-count';\nexport * from './types/dynamic-grid-analytics';\n","export * from './lib';\n","import * as React from 'react';\n\nimport cx from 'classnames';\n\nexport function mapTextAlignToClassname(textAlign: CmsAlignContent) {\n return {\n 'text-right': textAlign === 'right',\n 'text-left': textAlign === 'left',\n 'text-center': textAlign === 'center',\n };\n}\n\nexport function mapTextAlignToFlexClassname(textAlign: CmsAlignContent) {\n return {\n 'justify-start': textAlign === 'left',\n 'justify-end': textAlign === 'right',\n 'justify-center': textAlign === 'center',\n };\n}\n\nexport type TextualBlockProps = {\n children: React.ReactNode;\n brandComponentTheme?: CmsBrandComponentTheme;\n textAlign: 'left' | 'right' | 'center';\n hasBorderTrim: boolean;\n};\n\nexport const TextualBlock = React.forwardRef<HTMLDivElement, TextualBlockProps>(\n function TextualBlock(\n { children, brandComponentTheme, textAlign, hasBorderTrim }: TextualBlockProps,\n ref\n ) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return (\n <div\n className={cx(\n `relative bg-cover bg-no-repeat brand-qq:bg-[url('/modules/assets/images/curio-bg1.png')]`,\n {\n 'bg-bg-dark': isDark,\n 'bg-bg-light': isLight,\n }\n )}\n data-testid=\"textBlockBackgroundClassTest\"\n >\n <div\n className={cx(\n `container py-8 brand-wa:py-16 xl:py-12 brand-wa:xl:py-20`,\n mapTextAlignToClassname(textAlign)\n )}\n data-testid=\"textBlockContainer\"\n ref={ref}\n >\n <div\n className={cx('brand-qq:py-24', {\n 'outline outline-primary outline-1 px-10 py-6': hasBorderTrim,\n '!outline-bg brand-ou:!outline-secondary': isDark,\n 'brand-qq:outline-bg brand-ht:outline-bg': isLight, //remove brand-qq:outline-bg once background image work is complete\n })}\n >\n {children}\n </div>\n </div>\n </div>\n );\n }\n);\n\nexport function makeHeadingOverrides({\n brandComponentTheme,\n isAnimated,\n isInView,\n textAlign,\n}: {\n brandComponentTheme?: CmsBrandComponentTheme;\n textAlign: 'left' | 'right' | 'center';\n isAnimated: boolean;\n isInView: boolean;\n}): Record<'h1' | 'h2' | 'h3' | 'span', { props: { className: string } }> {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n const headingStyles = cx(\n 'brand-qq:px-12 brand-qq:pb-4 brand-qq:text-4xl brand-qq:tracking-wide brand-wa:font-sans brand-wa:font-light brand-wa:uppercase brand-wa:text-text brand-qq:md:px-0 brand-qq:md:text-6xl',\n mapTextAlignToClassname(textAlign),\n {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !isInView && isAnimated,\n 'opacity-100 translate-y-0': isInView && isAnimated,\n '!text-text-inverse brand-wa:!text-text-inverse': isDark,\n 'brand-ht:!text-text-inverse': isLight,\n },\n 'font-headline text-primary lg:mb-2'\n );\n\n return {\n h1: {\n props: {\n className: cx(headingStyles, 'heading-2xl lg:heading-5xl lg:mb-2'),\n },\n },\n h2: {\n props: {\n className: cx(headingStyles, 'heading-xl lg:heading-2xl lg:mb-2'),\n },\n },\n h3: {\n props: {\n className: cx(headingStyles, 'heading-lg lg:heading-xl lg:mb-2'),\n },\n },\n span: {\n props: {\n className: 'text-text py-2 sm:heading-lg lg:heading-xl block',\n },\n },\n };\n}\n\nexport type TextualDescriptionBlockProps = {\n children: React.ReactNode;\n brandComponentTheme?: CmsBrandComponentTheme;\n textAlign: 'left' | 'right' | 'center';\n isInView: boolean;\n isAnimated: boolean;\n};\n\nexport function makeDescriptionClassName({\n brandComponentTheme,\n textAlign,\n isInView,\n isAnimated,\n}: Omit<TextualDescriptionBlockProps, 'children'>) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return cx(\n 'brand-qq:px-20 brand-qq:pb-6 brand-qq:font-serif brand-qq:text-xl brand-qq:font-medium brand-qq:tracking-wider brand-qq:text-primary brand-qq:md:px-0',\n mapTextAlignToClassname(textAlign),\n {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !isInView && isAnimated,\n 'opacity-100 translate-y-0': isInView && isAnimated,\n 'text-text-inverse brand-qq:text-text-inverse': isDark,\n 'brand-ht:text-text-inverse': isLight,\n 'brand-hp:text-brand': brandComponentTheme !== 'dark',\n },\n 'py-2 brand-gi:font-serif brand-gi:font-semibold brand-wa:font-serif sm:text-lg lg:text-xl'\n );\n}\n\nexport function TextualDescriptionBlock({\n children,\n brandComponentTheme,\n textAlign,\n isInView,\n isAnimated,\n}: TextualDescriptionBlockProps) {\n const className = makeDescriptionClassName({\n brandComponentTheme,\n textAlign,\n isInView,\n isAnimated,\n });\n\n return (\n <div data-testid=\"textBlockBody\" className={className}>\n {children}\n </div>\n );\n}\n\nexport type TextualOrderedListBlockProps = {\n children: React.ReactNode;\n brandComponentTheme?: CmsBrandComponentTheme;\n textAlign: 'left' | 'right' | 'center';\n isInView: boolean;\n isAnimated: boolean;\n};\n\nexport function makeOrderedListClassName({\n isAnimated,\n isInView,\n brandComponentTheme,\n}: Omit<TextualOrderedListBlockProps, 'children' | 'textAlign'>) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return cx('list-outside list-decimal py-2 ps-4 text-left', {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !isInView && isAnimated,\n 'opacity-100 translate-y-0': isInView && isAnimated,\n 'text-text-inverse': isDark,\n 'brand-ht:text-text-inverse': isLight,\n });\n}\n\nexport function TextualOrderedListBlock({\n children,\n textAlign,\n isAnimated,\n isInView,\n brandComponentTheme,\n}: TextualOrderedListBlockProps) {\n const className = makeOrderedListClassName({\n isAnimated,\n isInView,\n brandComponentTheme,\n });\n\n return (\n <div className={cx('flex items-center', mapTextAlignToFlexClassname(textAlign))}>\n <ul className={className}>{children}</ul>\n </div>\n );\n}\n\nexport type TextualOrderedListItemBlockProps = {\n children: React.ReactNode;\n brandComponentTheme?: CmsBrandComponentTheme;\n};\n\nexport function makeOrderedListItemClassName({\n brandComponentTheme,\n}: Omit<TextualOrderedListItemBlockProps, 'children'>) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return cx(\n {\n 'text-text-inverse': isDark,\n 'brand-ht:text-text-inverse': isLight,\n },\n 'brand-wa:font-serif sm:text-lg lg:text-xl',\n {\n 'brand-hp:text-brand': brandComponentTheme !== 'dark',\n }\n );\n}\n\nexport function TextualOrderedListItemBlock({\n children,\n brandComponentTheme,\n}: TextualOrderedListItemBlockProps) {\n const className = makeOrderedListItemClassName({ brandComponentTheme });\n\n return (\n <li>\n <div data-testid=\"textBlockBody\" className={className}>\n {children}\n </div>\n </li>\n );\n}\n\nexport type TextualUnorderedListBlockProps = {\n children: React.ReactNode;\n brandComponentTheme?: CmsBrandComponentTheme;\n textAlign: 'left' | 'right' | 'center';\n isInView: boolean;\n isAnimated: boolean;\n};\n\nexport function makeUnorderedListClassName({\n isAnimated,\n isInView,\n brandComponentTheme,\n}: Omit<TextualUnorderedListBlockProps, 'children' | 'textAlign'>) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return cx('list-outside list-disc py-2 ps-5 text-left', {\n 'duration-1000 ease-in-out opacity-0 motion-reduce:transition-none motion-reduce:opacity-100':\n isAnimated,\n 'translate-y-4': !isInView && isAnimated,\n 'opacity-100 translate-y-0': isInView && isAnimated,\n 'text-text-inverse': isDark,\n 'brand-ht:text-text-inverse': isLight,\n });\n}\n\nexport function TextualUnorderedListBlock({\n children,\n textAlign,\n isAnimated,\n isInView,\n brandComponentTheme,\n}: TextualUnorderedListBlockProps) {\n const className = makeUnorderedListClassName({\n isAnimated,\n isInView,\n brandComponentTheme,\n });\n\n return (\n <div className={cx('flex items-center', mapTextAlignToFlexClassname(textAlign))}>\n <ul className={className}>{children}</ul>\n </div>\n );\n}\n\nexport type TextualUnorderedListItemBlockProps = {\n children: React.ReactNode;\n brandComponentTheme?: CmsBrandComponentTheme;\n};\nexport function TextualUnorderedListItemBlock({\n children,\n brandComponentTheme,\n}: TextualUnorderedListItemBlockProps) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n return (\n <li>\n <div\n data-testid=\"textBlockBody\"\n className={cx(\n {\n 'text-text-inverse': isDark,\n 'brand-ht:text-text-inverse': isLight,\n },\n 'brand-gi:font-serif brand-wa:font-serif sm:text-lg lg:text-xl',\n {\n 'brand-hp:text-brand': brandComponentTheme !== 'dark',\n }\n )}\n >\n {children}\n </div>\n </li>\n );\n}\n\nexport type TextualBlockLinkProps = React.HTMLAttributes<HTMLAnchorElement> & {\n brandComponentTheme?: CmsBrandComponentTheme;\n};\n\nexport function makeLinkClassName({ brandComponentTheme }: TextualBlockLinkProps) {\n return cx('underline', {\n 'text-text-inverse': brandComponentTheme === 'dark',\n 'text-primary hover:text-primary-alt brand-ht:text-text-inverse brand-ht:hover:text-text-inverse':\n brandComponentTheme === 'light',\n 'text-primary hover:text-primary-alt ':\n brandComponentTheme !== 'light' && brandComponentTheme !== 'dark',\n });\n}\n\nexport function TextualBlockLink({ brandComponentTheme, ...props }: TextualBlockLinkProps) {\n const className = makeLinkClassName({ brandComponentTheme });\n return <a {...props} target=\"_blank\" rel=\"noopener noreferrer\" className={className} />;\n}\n","export * from './textual-block';\n","export * from './lib';\n","import type * as React from 'react';\nimport { useIntersectionObserver } from 'usehooks-ts';\nimport cx from 'classnames';\nimport { getIsReducedMotion } from '@dx-ui/utilities-accessibility';\n\nexport type AnimateRevealItemType = {\n delay: number;\n isAnimated?: boolean;\n animationType?: 'fade-in-up' | 'wipe' | 'fade-in';\n className?: string;\n};\n\nexport const AnimateRevealItem: React.FC<React.PropsWithChildren<AnimateRevealItemType>> = ({\n children,\n delay,\n animationType = 'fade-in',\n isAnimated = false,\n className,\n}) => {\n const isReducedMotion = getIsReducedMotion();\n const { ref: intersectionRef, isIntersecting: inView } = useIntersectionObserver({\n threshold: [0.3],\n freezeOnceVisible: true,\n });\n const ref = !isReducedMotion && isAnimated ? intersectionRef : null;\n\n if (animationType === 'wipe') {\n const clipPathValue = inView ? 'inset(0% 0% 0%)' : 'inset(0% 0% 100%)';\n\n return (\n <div className={className} ref={ref}>\n <div\n className={cx({\n 'opacity-100': inView && isAnimated,\n 'duration-1000 ease-in-out opacity-0 motion-reduce:opacity-100 motion-reduce:transition-none':\n isAnimated,\n })}\n data-testid=\"wipe-item-wrapper\"\n style={\n isAnimated\n ? {\n transitionDelay: `${delay}ms`,\n clipPath: isReducedMotion ? 'inset(0% 0% 0%)' : clipPathValue,\n }\n : {}\n }\n >\n {children}\n </div>\n </div>\n );\n }\n\n const isFadeInUp = animationType === 'fade-in-up';\n\n return (\n <div\n ref={ref}\n data-testid=\"fade-item-wrapper\"\n style={\n isAnimated\n ? {\n transitionDelay: `${delay}ms`,\n transitionTimingFunction: 'cubic-bezier(.25, .46, .45, .99);',\n }\n : {}\n }\n className={cx(\n {\n 'opacity-100': inView && isAnimated,\n 'opacity-100 translate-y-0': inView && isAnimated && isFadeInUp,\n 'translate-y-6': !inView && isAnimated && isFadeInUp,\n 'duration-1000 opacity-0 motion-reduce:transition-none motion-reduce:opacity-100 transition-all':\n isAnimated,\n },\n className\n )}\n >\n {children}\n </div>\n );\n};\n\nexport default AnimateRevealItem;\n","export * from './animate-reveal-item';\n","export * from './lib';\n"],"names":["DynamicImage","id","imageUrl","altText","aspectRatio","tabletAspectRatio","mobileAspectRatio","tabletImageUrl","mobileImageUrl","width","captionData","className","sharedProps","ResponsivePicture","ResponsiveImage","generateDynamicGridMetrics","metrics","position","count","itemTitle","ANALYTICS_NO_VALUE","headline","imageFunction","ImageFunction","Modal","click","clickID","ImageClickID","Img","osc","image","type","ImageType","Dynamic","function","DynamicGridCardHeader","ar","isDark","isLight","div","cx","baseClasses","positionClasses","data-testid","span","ref","useRef","DynamicGridItem","buttonRef","rect","useRect","t","useTranslation","onItemClick","variant","brandComponentTheme","listHeadline","item","imageAspectRatio","tabletImageAspectRatio","mobileImageAspectRatio","isCardLayout","button","onClick","onClickGridItem","trackEvent","ANALYTICS_GLOBAL_CLICK_EVENT","current","cmsTranslationClasses","onFocus","handleOnFocus","setTimeout","scrollIntoView","behavior","block","inline","cmsDocumentControl","getDynamicGridColumnCount","columnCount","is369","is4x","is2x","isOther","modalImageAspectRatio","items","baseItems","isMobileVerticalStack","listDescription","textAlign","onViewItem","onToggleModal","isAnimated","dynamicGridId","props","activeId","updateActiveId","useState","isModalOpen","updateModalOpen","activeListItem","setActiveListItem","filter","Boolean","length","openModal","el","activeItem","find","i","section","BrandTextHeader","mapTextAlignToClassname","BrandTextBody","gridWrapperClass","tabIndex","map","index","AnimateRevealItem","delay","DialogWithContent","ariaLabel","containerAspectRatio","modalImageUrl","imageAltText","imageAltTxt","title","content","shortDescription","link","isOpen","onClose","closeModal","focus","DynamicGridItemWOM","gridItemRef","intersectionRef","useIntersectionObserver","threshold","freezeOnceVisible","observedWrapper","getIsReducedMotion","headlineId","Link","HeadingLevel","headingLevelFallback","data-osc-product","label","url","anchorClassName","isNewWindow","showNewWindowIcon","underline","cidParams","data-conductrics-goal","experimentationConfiguration","goal","data-conductrics-value","value","handleLinkFocus","e","useHasOverflow","onlyHorizontal","onlyVertical","isOverflow","setIsOverflow","undefined","useLayoutEffect","trigger","hasOverflowHorizontal","scrollWidth","clientWidth","hasOverflowVertical","scrollHeight","clientHeight","window","ResizeObserver","observe","listSubheading","wrapperClassName","isIntersecting","inView","hasLinks","some","headerId","useId","scrollRef","hasOverflow","scrollSectionIsFocusable","aria-labelledby","HeadingLevelProvider","shouldIncreaseLevel","itemIndex","adaDescription","BrandLink","mapTextAlignToFlexClassname","TextualBlock","React","children","hasBorderTrim","makeHeadingOverrides","isInView","headingStyles","h1","h2","h3","makeDescriptionClassName","TextualDescriptionBlock","makeOrderedListClassName","TextualOrderedListBlock","ul","makeOrderedListItemClassName","TextualOrderedListItemBlock","li","makeUnorderedListClassName","TextualUnorderedListBlock","TextualUnorderedListItemBlock","makeLinkClassName","animationType","isReducedMotion","clipPathValue","style","transitionDelay","clipPath","isFadeInUp","transitionTimingFunction"],"sourceRoot":"","ignoreList":[]}