{"version":3,"file":"coopse.script.6437.86e3bded.chunk.js","mappings":"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","sources":["webpack:///./src/microApps/common/components/Heading/Heading.module.less","webpack:///./src/microApps/common/components/Heading/Heading.tsx","webpack:///./src/microApps/common/components/atoms/ConditionalWrapper.tsx","webpack:///./src/microApps/common/tracking/hooks/usePromotionTracking.ts","webpack:///./src/microApps/episerver/components/base/EpiContentArea.tsx","webpack:///./src/microApps/common/components/organisms/FullWidthBlockContainer/FullWidthBlockContainer.tsx","webpack:///./src/microApps/episerver/components/blocks/EpiFullWidthBlockContainer/EpiFullWidthBlockContainer.tsx","webpack:///./src/microApps/episerver/components/blocks/EpiFullWidthBlockContainer/EpiFullWidthBlockContainer.utils.ts","webpack:///./src/microApps/episerver/components/blocks/EpiHeadingPropertyBlock/EpiHeadingPropertyBlock.utils.ts","webpack:///./src/microApps/episerver/epiUtils.ts","webpack:///../../node_modules/react-intersection-observer/react-intersection-observer.modern.mjs"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"Heading\":\"E17FI2IV\",\"Heading--coopGreen\":\"JZ_2qqd6\",\"Heading--darkGreen\":\"htkN9xWM\",\"Heading--white\":\"y1M7QAC6\",\"Heading--black\":\"K8xICLcl\",\"Heading--colorGreen2\":\"wUVrHEa9\",\"FontFamilySecondary\":\"CO0BQ7N3\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useEffect } from 'react';\n\nimport styles from './Heading.module.less';\n\ninterface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n element: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p';\n stylingElement?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n fontFamilySecondary?: boolean;\n color?: 'coopGreen' | 'darkGreen' | 'white' | 'black' | 'colorGreen2';\n alignment?: 'start' | 'center' | 'end';\n}\n\nconst Heading = React.forwardRef<HTMLHeadingElement, React.PropsWithChildren<HeadingProps>>(\n (props, ref) => {\n if (!props.children) return null;\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const { fontFamilySecondary, stylingElement, element, className, alignment, ...rest } =\n props;\n\n const alignStyles: React.CSSProperties = {\n width: '100%',\n };\n switch (alignment) {\n case 'start': {\n alignStyles.textAlign = 'left';\n break;\n }\n case 'end': {\n alignStyles.textAlign = 'right';\n break;\n }\n case 'center':\n default: {\n alignStyles.textAlign = 'center';\n break;\n }\n }\n return (\n <props.element\n ref={ref}\n className={classNames(\n styles.Heading,\n stylingElement && `Heading--${stylingElement}`,\n props.color ? styles[`Heading--${props.color}`] : styles['Heading--black'],\n fontFamilySecondary && styles.FontFamilySecondary,\n className,\n )}\n style={{\n ...rest.style,\n ...alignStyles,\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...rest}\n >\n {props.children}\n </props.element>\n );\n },\n);\n\ninterface PageHeadingProps extends Omit<HeadingProps, 'element'> {\n visuallyHidden?: boolean;\n}\n\nexport const PageHeading = React.forwardRef<\n HTMLHeadingElement,\n React.PropsWithChildren<PageHeadingProps>\n>((props, ref) => {\n // The effect simulates what browsers do on a normal non-SPA apps - they reloading a page and set focus to the top of the page (body).\n useEffect(() => {\n document.body.focus();\n }, []);\n\n return (\n <Heading\n ref={ref}\n element=\"h1\"\n tabIndex={-1}\n stylingElement={props.stylingElement}\n fontFamilySecondary={props.fontFamilySecondary}\n className={classNames(props.className, props.visuallyHidden && 'u-hiddenVisually')}\n color={props.color}\n >\n {props.children}\n </Heading>\n );\n});\n\nexport default Heading;\n","import type { FC, ReactNode } from 'react';\nimport { Fragment } from 'react';\n\ninterface ConditionalWrapperProps {\n condition: boolean;\n renderWrapper: (children: ReactNode) => ReactNode;\n}\n\nexport const ConditionalWrapper: FC<React.PropsWithChildren<ConditionalWrapperProps>> = (props) =>\n // eslint-disable-next-line react/jsx-no-useless-fragment\n props.condition ? <>{props.renderWrapper(props.children)}</> : <>{props.children}</>;\n\ninterface ConditionalMultipleWrappersProps {\n choices: {\n condition: boolean;\n renderWrapper: (children: ReactNode) => ReactNode;\n }[];\n\n children: ReactNode;\n}\n\nexport const ConditionalMultipleWrappers: FC<\n React.PropsWithChildren<ConditionalMultipleWrappersProps>\n> = (props) => {\n return (\n <>\n {props.choices.map(\n (choice, index) =>\n choice.condition && (\n // eslint-disable-next-line react/no-array-index-key\n <Fragment key={index}>{choice.renderWrapper(props.children)}</Fragment>\n ),\n )}\n </>\n );\n};\n","import { useEffect } from 'react';\nimport { useInView } from 'react-intersection-observer';\n\nimport { ga4PromotionTracking } from '../ga4/promotion';\nimport type { IGaPromoData } from '../models/IGaPromoData';\n\nconst usePromotionTracking = ({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n}: IGaPromoData) => {\n const [ref, inView] = useInView({\n triggerOnce: true,\n threshold: 0.5,\n });\n\n useEffect(() => {\n if (inView) {\n ga4PromotionTracking.viewPromotion({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n });\n }\n }, [gaPromoCreative, gaPromoId, gaPromoName, gaPromoPosition, inView]);\n\n const click = () => {\n ga4PromotionTracking.selectPromotion({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n });\n };\n\n return { ref, click };\n};\n\nexport default usePromotionTracking;\n","/* eslint-disable react/no-array-index-key */\n/* eslint-disable react/jsx-props-no-spreading */\n/* eslint-disable react/jsx-no-useless-fragment */\nimport classNames from 'classnames';\n\nimport { getCssClassForDisplayOptionWithDefaultTag } from '../../epiUtils';\nimport EpiComponentLoader from './EpiComponentLoader';\n\ninterface EpiContentAreaProps {\n items: ContentAreaItem[];\n epiTag?: DisplayOption;\n itemCssClass?: string;\n /** If you pass renderItem function, you are responsible for generating item itself as well as it's Grid cell.\n * Use contentAreaItem, contentAreaItemClasses parameters to get access to default values for items.\n */\n renderItem?: (\n componentProps: IContent,\n contentAreaItem: ContentAreaItem,\n contentAreaItemClasses: string,\n ) => React.ReactNode;\n}\n\nconst EpiContentArea = ({ items, epiTag, itemCssClass, renderItem }: EpiContentAreaProps) => {\n const areaItems = items?.filter((x) => !!x && !!x.contentLink.expanded) || [];\n\n return (\n <>\n {areaItems.map((contentAreaItem, index) => (\n <EpiComponentLoader\n expandedValue={contentAreaItem.contentLink.expanded!}\n options={{\n isContentAreaItem: true,\n }}\n key={`{${contentAreaItem.contentLink.guidValue}_${index}}`}\n >\n {(LazyComponent, epiComponentProps) => {\n const contentAreaItemClasses = classNames(\n getCssClassForDisplayOptionWithDefaultTag(\n contentAreaItem.displayOption || epiTag,\n ),\n itemCssClass,\n );\n\n return (\n <>\n {(renderItem &&\n renderItem(\n epiComponentProps,\n contentAreaItem,\n contentAreaItemClasses,\n )) || (\n <div className={contentAreaItemClasses}>\n <LazyComponent {...epiComponentProps} />\n </div>\n )}\n </>\n );\n }}\n </EpiComponentLoader>\n ))}\n </>\n );\n};\n\nexport default EpiContentArea;\n","import { Button } from '@coop/components';\nimport classNames from 'classnames';\n\nimport EpiContentArea from '../../../../episerver/components/base/EpiContentArea';\nimport usePromotionView from '../../../tracking/hooks/usePromotionTracking';\nimport { ConditionalWrapper } from '../../atoms/ConditionalWrapper';\nimport Heading from '../../Heading';\n\ninterface FullWidthBlockContainerProps {\n headingProps?: React.ComponentPropsWithoutRef<typeof Heading>;\n blocks: ContentAreaItem[];\n linkUrl?: string;\n linkText: string;\n noVerticalMargin: boolean;\n horizontalMarginClass:\n | ''\n | 'Grid--gutterHxlg'\n | 'Grid--gutterHlg'\n | 'Grid--gutterH'\n | 'Grid--gutterHmd'\n | 'Grid--gutterHxsm'\n | 'Grid--gutterH2xsm';\n verticalMarginClass:\n | ''\n | 'Grid--gutterVxlg'\n | 'Grid--gutterVlg'\n | 'Grid--gutterV'\n | 'Grid--gutterVmd'\n | 'Grid--gutterVxsm'\n | 'Grid--gutterV2xsm';\n center: boolean;\n backgroundColor?: 'u-bgWhite' | 'u-bgGreenDark' | 'u-bgGreen' | 'u-bgGreenLight2';\n gaPromoPosition?: string;\n gaPromoCreative?: string;\n gaPromoId?: string;\n gaPromoName?: string;\n padding: 'responsive' | undefined;\n}\n\nconst FullWidthBlockContainer = ({\n headingProps,\n blocks,\n linkUrl,\n linkText,\n noVerticalMargin,\n horizontalMarginClass,\n verticalMarginClass,\n center,\n backgroundColor,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n gaPromoCreative,\n padding,\n}: FullWidthBlockContainerProps) => {\n const { ref, click } = usePromotionView({\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n gaPromoCreative,\n });\n\n return (\n <ConditionalWrapper\n condition={center}\n renderWrapper={(children) => (\n <div className=\"Main-container Main-container--medium\">{children}</div>\n )}\n >\n <div\n ref={ref}\n className={classNames(\n 'Section',\n backgroundColor,\n padding === 'responsive' ? 'Section--padding' : '',\n )}\n >\n {headingProps && (\n <Heading\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...headingProps}\n className=\"u-marginBmd\"\n />\n )}\n <div\n className={classNames(\n 'Grid Grid--equalHeight Grid--gutterV',\n noVerticalMargin ? '' : verticalMarginClass,\n horizontalMarginClass,\n )}\n >\n <EpiContentArea items={blocks} epiTag=\"full\" />\n </div>\n {linkUrl && linkText?.length > 0 && (\n <Footer url={linkUrl} linkText={linkText} onClick={click} />\n )}\n </div>\n </ConditionalWrapper>\n );\n};\n\nconst Footer = ({\n url,\n linkText,\n onClick,\n}: {\n url: string;\n linkText: string;\n onClick: () => void;\n}) => {\n return (\n <div className=\"u-textCenter\">\n <Button asChild size={40} theme=\"primary\" className=\"u-marginT u-marginHauto\">\n <a href={url} onClick={onClick}>\n {linkText}\n </a>\n </Button>\n </div>\n );\n};\n\nexport default FullWidthBlockContainer;\n","import type Heading from '../../../../common/components/Heading';\nimport FullWidthBlockContainer from '../../../../common/components/organisms/FullWidthBlockContainer/FullWidthBlockContainer';\nimport { mapEpiHeadingPropertyFallback } from '../EpiHeadingPropertyBlock/EpiHeadingPropertyBlock.utils';\nimport type { EpiHeadingPropertyBlockType } from '../EpiHeadingPropertyBlock/epiHeadingPropertyBlockType';\nimport { mapEpiContainerPadding } from './EpiFullWidthBlockContainer.utils';\nimport type { EpiFullWidthBlockContainerType } from './epiFullWidthBlockContainerType';\n\nconst mapEpiHeading = (\n heading?: EpiHeadingPropertyBlockType,\n): React.ComponentPropsWithoutRef<typeof Heading> | undefined => {\n if (!heading || !heading.text?.trim()) {\n return undefined;\n }\n return {\n children: heading.text.trim(),\n alignment: heading.alignment || 'center',\n color: heading.color || 'black',\n element: `h${heading.level || 2}`,\n stylingElement: `h${heading.stylingLevel || 1}`,\n fontFamilySecondary: true,\n };\n};\n\nconst EpiFullWidthBlockContainer = (props: EpiFullWidthBlockContainerType) => {\n const mappedHeading = mapEpiHeading(\n mapEpiHeadingPropertyFallback(props.headline, props.heading),\n );\n\n return (\n <FullWidthBlockContainer\n headingProps={mappedHeading}\n blocks={props.blocks}\n linkUrl={props.link?.url}\n linkText={props.linkText}\n noVerticalMargin={props.noVerticalMargin}\n horizontalMarginClass={props.horizontalMarginClass}\n verticalMarginClass={props.verticalMarginClass}\n center={props.center}\n backgroundColor={props.backgroundColor}\n gaPromoPosition={props.gaPromoPosition}\n gaPromoCreative={props.gaPromoCreative}\n gaPromoId={props.gaPromoId}\n gaPromoName={props.gaPromoName}\n padding={mapEpiContainerPadding(props.padding)}\n />\n );\n};\n\nexport default EpiFullWidthBlockContainer;\n","import type { EpiContainerPadding } from './epiFullWidthBlockContainerType';\n\nexport const mapEpiContainerPadding = (padding: EpiContainerPadding) => {\n switch (padding) {\n case 'responsive':\n return padding;\n default:\n return undefined;\n }\n};\n","import type Heading from '../../../../common/components/Heading';\nimport type { EpiHeadingPropertyBlockType } from './epiHeadingPropertyBlockType';\n\nexport const mapEpiHeadingPropertyBlock = (\n props?: EpiHeadingPropertyBlockType,\n): React.ComponentPropsWithoutRef<typeof Heading> | undefined => {\n if (!props || !props.text) {\n return undefined;\n }\n\n return {\n element: `h${props.level || '2'}`,\n stylingElement: props.stylingLevel && `h${props.stylingLevel}`,\n color: props.color,\n alignment: props.alignment,\n children: props.text,\n };\n};\n\nexport const mapEpiHeadingPropertyFallback = (\n oldHeader?: string,\n heading?: EpiHeadingPropertyBlockType,\n): EpiHeadingPropertyBlockType => {\n if (heading && heading.text) {\n return heading;\n }\n\n return {\n text: oldHeader,\n };\n};\n","import { appConfig } from '../../appConfig';\nimport type { PageHeadData } from '../common/components/atoms/PageHead';\nimport { ensureTrailingSlash } from '../common/utils/urlUtils';\nimport type { EpiPageTypes } from './components/pages/epiPageTypes';\nimport type { EpiSitePageType } from './components/pages/epiSitePageType';\n\nexport const getCssClassForDisplayOptionWithDefaultTag = (name: DisplayOption) => {\n const potentialCssClass = appConfig.coopSettings.epi.blockDisplayOptionToCssClass[name];\n\n if (potentialCssClass) {\n return `${appConfig.coopSettings.epi.baseChildrenCssClass} ${potentialCssClass}`;\n }\n\n return appConfig.coopSettings.epi.baseChildrenCssClass;\n};\n\nexport const filterContentArea = <T extends IContent>(\n contentArea: ContentAreaItem[],\n predicate: (content: IContent) => content is T,\n): T[] => {\n const contents =\n contentArea\n ?.map((x) => x.contentLink?.expanded)\n .filter(Boolean)\n .filter(predicate) || [];\n return contents;\n};\n\nexport const filterContent = <T extends IContent>(\n contentItems: IContent[],\n predicate: (content: IContent) => content is T,\n): T[] => {\n const filteredContents = contentItems?.filter(predicate) || [];\n return filteredContents;\n};\n\nexport const filterContentType = <T extends EpiPageTypes[keyof EpiPageTypes]>(\n contents: IContent[],\n contentType: keyof EpiPageTypes,\n): T[] => {\n return (contents?.filter((item) => item.contentType.includes(contentType)) as T[]) || [];\n};\n\n/**\n * Use with caution, EPI adds ?epieditmode=True in edit mode, but so can users\n */\nexport const isEpiEditMode = () =>\n new URLSearchParams(window.location.search).get('epieditmode') === 'True';\n\nexport const editTableProp = (name: string) => (window.epi?.inEditMode ? name : undefined);\n\nexport const mapEpiPageHeadData = (page: EpiSitePageType): PageHeadData => {\n const canonicalUrl = page.canonicalUrl && ensureTrailingSlash(page.canonicalUrl);\n\n return {\n title: page.pageTitle,\n link: {\n canonical: canonicalUrl,\n },\n meta: {\n description: page.metaDescription,\n 'og:url': canonicalUrl,\n 'og:description': page.metaDescription,\n },\n };\n};\n\nexport const isEpiPageViewSettings = (page: IContent): page is PageViewSettingsIContent => {\n return 'contentPageSize' in (page as PageViewSettingsIContent);\n};\n\nexport const isContentReference = (input: unknown): input is ContentReference => {\n return 'url' in (input as ContentReference);\n};\n","import * as React from 'react';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst observerMap = new Map();\nconst RootIds = new WeakMap();\nlet rootId = 0;\nlet unsupportedValue = undefined;\n/**\r\n * What should be the default behavior if the IntersectionObserver is unsupported?\r\n * Ideally the polyfill has been loaded, you can have the following happen:\r\n * - `undefined`: Throw an error\r\n * - `true` or `false`: Set the `inView` value to this regardless of intersection state\r\n * **/\n\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\n/**\r\n * Generate a unique ID for the root element\r\n * @param root\r\n */\n\nfunction getRootId(root) {\n if (!root) return '0';\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\n/**\r\n * Convert the options to a string Id, based on the values.\r\n * Ensures we can reuse the same observer when observing elements with the same options.\r\n * @param options\r\n */\n\n\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(key => options[key] !== undefined).map(key => {\n return `${key}_${key === 'root' ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\n\nfunction createObserver(options) {\n // Create a unique ID for this observer instance, based on the root, root margin and threshold.\n let id = optionsToId(options);\n let instance = observerMap.get(id);\n\n if (!instance) {\n // Create a map of elements this observer is going to observe. Each element has a list of callbacks that should be triggered, once it comes into view.\n const elements = new Map();\n let thresholds;\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n var _elements$get;\n\n // While it would be nice if you could just look at isIntersecting to determine if the component is inside the viewport, browsers can't agree on how to use it.\n // -Firefox ignores `threshold` when considering `isIntersecting`, so it will never be false again if `threshold` is > 0\n const inView = entry.isIntersecting && thresholds.some(threshold => entry.intersectionRatio >= threshold); // @ts-ignore support IntersectionObserver v2\n\n if (options.trackVisibility && typeof entry.isVisible === 'undefined') {\n // The browser doesn't support Intersection Observer v2, falling back to v1 behavior.\n // @ts-ignore\n entry.isVisible = inView;\n }\n\n (_elements$get = elements.get(entry.target)) == null ? void 0 : _elements$get.forEach(callback => {\n callback(inView, entry);\n });\n });\n }, options); // Ensure we have a valid thresholds array. If not, use the threshold from the options\n\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n\n return instance;\n}\n/**\r\n * @param element - DOM Element to observe\r\n * @param callback - Callback function to trigger when intersection status changes\r\n * @param options - Intersection Observer options\r\n * @param fallbackInView - Fallback inView value.\r\n * @return Function - Cleanup function that should be triggered to unregister the observer\r\n */\n\n\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === 'undefined' && fallbackInView !== undefined) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === 'number' ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {// Nothing to cleanup\n };\n } // An observer with the same options can be reused, so lets use this fact\n\n\n const {\n id,\n observer,\n elements\n } = createObserver(options); // Register the callback listener for this element\n\n let callbacks = elements.get(element) || [];\n\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n // Remove the callback from the callback list\n callbacks.splice(callbacks.indexOf(callback), 1);\n\n if (callbacks.length === 0) {\n // No more callback exists for element, so destroy it\n elements.delete(element);\n observer.unobserve(element);\n }\n\n if (elements.size === 0) {\n // No more elements are being observer by this instance, so destroy it\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\nconst _excluded = [\"children\", \"as\", \"triggerOnce\", \"threshold\", \"root\", \"rootMargin\", \"onChange\", \"skip\", \"trackVisibility\", \"delay\", \"initialInView\", \"fallbackInView\"];\n\nfunction isPlainChildren(props) {\n return typeof props.children !== 'function';\n}\n/**\r\n ## Render props\r\n\n To use the `<InView>` component, you pass it a function. It will be called\r\n whenever the state changes, with the new value of `inView`. In addition to the\r\n `inView` prop, children also receive a `ref` that should be set on the\r\n containing DOM element. This is the element that the IntersectionObserver will\r\n monitor.\r\n\n If you need it, you can also access the\r\n [`IntersectionObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry)\r\n on `entry`, giving you access to all the details about the current intersection\r\n state.\r\n\n ```jsx\r\n import { InView } from 'react-intersection-observer';\r\n\n const Component = () => (\r\n <InView>\r\n {({ inView, ref, entry }) => (\r\n <div ref={ref}>\r\n <h2>{`Header inside viewport ${inView}.`}</h2>\r\n </div>\r\n )}\r\n </InView>\r\n );\r\n\n export default Component;\r\n ```\r\n\n ## Plain children\r\n\n You can pass any element to the `<InView />`, and it will handle creating the\r\n wrapping DOM element. Add a handler to the `onChange` method, and control the\r\n state in your own component. Any extra props you add to `<InView>` will be\r\n passed to the HTML element, allowing you set the `className`, `style`, etc.\r\n\n ```jsx\r\n import { InView } from 'react-intersection-observer';\r\n\n const Component = () => (\r\n <InView as=\"div\" onChange={(inView, entry) => console.log('Inview:', inView)}>\r\n <h2>Plain children are always rendered. Use onChange to monitor state.</h2>\r\n </InView>\r\n );\r\n\n export default Component;\r\n ```\r\n */\n\n\nclass InView extends React.Component {\n constructor(props) {\n super(props);\n this.node = null;\n this._unobserveCb = null;\n\n this.handleNode = node => {\n if (this.node) {\n // Clear the old observer, before we start observing a new element\n this.unobserve();\n\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n // Reset the state if we get a new node, and we aren't ignoring updates\n this.setState({\n inView: !!this.props.initialInView,\n entry: undefined\n });\n }\n }\n\n this.node = node ? node : null;\n this.observeNode();\n };\n\n this.handleChange = (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n // If `triggerOnce` is true, we should stop observing the element.\n this.unobserve();\n }\n\n if (!isPlainChildren(this.props)) {\n // Store the current State, so we can pass it to the children in the next render update\n // There's no reason to update the state for plain children, since it's not used in the rendering.\n this.setState({\n inView,\n entry\n });\n }\n\n if (this.props.onChange) {\n // If the user is actively listening for onChange, always trigger it\n this.props.onChange(inView, entry);\n }\n };\n\n this.state = {\n inView: !!props.initialInView,\n entry: undefined\n };\n }\n\n componentDidUpdate(prevProps) {\n // If a IntersectionObserver option changed, reinit the observer\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n\n componentWillUnmount() {\n this.unobserve();\n this.node = null;\n }\n\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(this.node, this.handleChange, {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n }, fallbackInView);\n }\n\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n\n this._unobserveCb = null;\n }\n }\n\n render() {\n if (!isPlainChildren(this.props)) {\n const {\n inView,\n entry\n } = this.state;\n return this.props.children({\n inView,\n entry,\n ref: this.handleNode\n });\n }\n\n const _this$props = this.props,\n {\n children,\n as\n } = _this$props,\n props = _objectWithoutPropertiesLoose(_this$props, _excluded);\n\n return React.createElement(as || 'div', _extends({\n ref: this.handleNode\n }, props), children);\n }\n\n}\n\n/**\r\n * React Hooks make it easy to monitor the `inView` state of your components. Call\r\n * the `useInView` hook with the (optional) [options](#options) you need. It will\r\n * return an array containing a `ref`, the `inView` status and the current\r\n * [`entry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry).\r\n * Assign the `ref` to the DOM element you want to monitor, and the hook will\r\n * report the status.\r\n *\r\n * @example\r\n * ```jsx\r\n * import React from 'react';\r\n * import { useInView } from 'react-intersection-observer';\r\n *\r\n * const Component = () => {\r\n * const { ref, inView, entry } = useInView({\r\n * threshold: 0,\r\n * });\r\n *\r\n * return (\r\n * <div ref={ref}>\r\n * <h2>{`Header inside viewport ${inView}.`}</h2>\r\n * </div>\r\n * );\r\n * };\r\n * ```\r\n */\n\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _state$entry;\n\n const [ref, setRef] = React.useState(null);\n const callback = React.useRef();\n const [state, setState] = React.useState({\n inView: !!initialInView,\n entry: undefined\n }); // Store the onChange callback in a `ref`, so we can access the latest instance\n // inside the `useEffect`, but without triggering a rerender.\n\n callback.current = onChange;\n React.useEffect(() => {\n // Ensure we have node ref, and that we shouldn't skip observing\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(ref, (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n\n if (entry.isIntersecting && triggerOnce && unobserve) {\n // If it should only trigger once, unobserve the element after it's inView\n unobserve();\n unobserve = undefined;\n }\n }, {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n }, fallbackInView);\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n }, // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [// If the threshold is an array, convert it to a string, so it won't change between renders.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Array.isArray(threshold) ? threshold.toString() : threshold, ref, root, rootMargin, triggerOnce, skip, trackVisibility, fallbackInView, delay]);\n const entryTarget = (_state$entry = state.entry) == null ? void 0 : _state$entry.target;\n const previousEntryTarget = React.useRef();\n\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n // If we don't have a node ref, then reset the state (unless the hook is set to only `triggerOnce` or `skip`)\n // This ensures we correctly reflect the current state - If you aren't observing anything, then nothing is inView\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: undefined\n });\n }\n\n const result = [setRef, state.inView, state.entry]; // Support object destructuring, by adding the specific values.\n\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\nexport { InView, defaultFallbackInView, observe, useInView };\n//# sourceMappingURL=react-intersection-observer.modern.mjs.map\n"],"names":["Heading","props","ref","children","fontFamilySecondary","stylingElement","element","className","alignment","rest","alignStyles","width","textAlign","color","FontFamilySecondary","style","useEffect","document","body","focus","tabIndex","visuallyHidden","ConditionalWrapper","condition","renderWrapper","ConditionalMultipleWrappers","choices","map","choice","index","Fragment","gaPromoCreative","gaPromoId","gaPromoName","gaPromoPosition","inView","triggerOnce","threshold","viewPromotion","click","selectPromotion","items","epiTag","itemCssClass","renderItem","areaItems","filter","x","contentLink","expanded","contentAreaItem","expandedValue","options","isContentAreaItem","LazyComponent","epiComponentProps","contentAreaItemClasses","displayOption","guidValue","Footer","url","linkText","onClick","Button","asChild","size","theme","href","headingProps","blocks","linkUrl","noVerticalMargin","horizontalMarginClass","verticalMarginClass","center","backgroundColor","padding","EpiContentArea","length","mappedHeading","heading","text","trim","level","stylingLevel","mapEpiHeading","mapEpiHeadingPropertyFallback","headline","link","mapEpiContainerPadding","mapEpiHeadingPropertyBlock","oldHeader","getCssClassForDisplayOptionWithDefaultTag","name","potentialCssClass","coopSettings","epi","blockDisplayOptionToCssClass","baseChildrenCssClass","filterContentArea","contentArea","predicate","Boolean","filterContentType","contents","contentType","item","includes","isEpiEditMode","URLSearchParams","window","location","search","get","mapEpiPageHeadData","page","canonicalUrl","title","pageTitle","canonical","meta","description","metaDescription","isEpiPageViewSettings","observerMap","Map","RootIds","WeakMap","unsupportedValue","rootId","observe","callback","fallbackInView","IntersectionObserver","undefined","bounds","getBoundingClientRect","isIntersecting","target","intersectionRatio","time","boundingClientRect","intersectionRect","rootBounds","id","observer","elements","Object","keys","sort","key","root","has","set","toString","optionsToId","instance","thresholds","entries","forEach","entry","_elements$get","some","trackVisibility","isVisible","Array","isArray","createObserver","callbacks","push","splice","indexOf","delete","unobserve","disconnect","useInView","delay","rootMargin","skip","initialInView","onChange","_state$entry","setRef","state","setState","current","entryTarget","previousEntryTarget","result"],"sourceRoot":""}