{"version":3,"file":"static/js/315f87e491b3f57568e6.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/loacker/views/active-image.view.tsx?1cee","webpack://Msdyn365.Commerce.Online/./lib/active-image/module-registration.js?d2eb","webpack://Msdyn365.Commerce.Online/./src/modules/actions/get-active-image-products.ts?0501","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.tsx?00d3","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IActiveImageAdditionalContentViewProps, IArea } from '@msdyn365-commerce-modules/active-image/src/modules/active-image/../active-image-utilities';\r\nimport { IActiveImageViewProps } from '@msdyn365-commerce-modules/active-image/src/modules/active-image/./active-image';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { IActiveImageConfig } from '@msdyn365-commerce-modules/active-image/src/modules/active-image';\r\n\r\n/**\r\n * Render Additional Content.\r\n * @param additionalContent - Additional content view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\r\n return (\r\n \r\n {additionalContent.heading}\r\n \r\n {additionalContent.text}\r\n \r\n {additionalContent.links}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render View.\r\n * @param props - The view props.\r\n * @returns -The JSX Element.\r\n */\r\nexport const activeImageView: React.FC = props => {\r\n const hoverArea = (event: React.MouseEvent | React.TouchEvent, index: number) => {\r\n const target = event.target as HTMLElement;\r\n const map = target?.closest('.msc-active-image__area-with-dots')?.getElementsByClassName('msc-active-image-map')[0] as HTMLMapElement;\r\n map?.areas[index].dispatchEvent(new MouseEvent('mouseover', { 'bubbles': true }));\r\n const mapCtn = target?.closest('.msc-active-image')?.getElementsByClassName('msc-active-image-product-card-container')[0];\r\n const firstElement = mapCtn && mapCtn.firstChild as HTMLElement;\r\n if(firstElement){\r\n firstElement.style.display = 'block';\r\n }\r\n }\r\n const leaveArea = (event: React.MouseEvent, index: number) => {\r\n const target = event.target as HTMLElement;\r\n const map = target?.closest('.msc-active-image__area-with-dots')?.getElementsByClassName('msc-active-image-map')[0] as HTMLMapElement;\r\n map?.areas[index].dispatchEvent(new MouseEvent('mouseleave', { 'bubbles': true }));\r\n const mapCtn = target?.closest('.msc-active-image')?.getElementsByClassName('msc-active-image-product-card-container')[0];\r\n const firstElement = mapCtn && mapCtn.firstChild as HTMLElement;\r\n if(firstElement){\r\n firstElement.style.display = 'none';\r\n }\r\n }\r\n const clickArea = (event: React.MouseEvent | React.TouchEvent, index: number) => {\r\n const target = event.target as HTMLElement;\r\n const map = target?.closest('.msc-active-image__area-with-dots')?.getElementsByClassName('msc-active-image-map')[0] as HTMLMapElement;\r\n map?.areas[index].dispatchEvent(new MouseEvent('click', { 'bubbles': true }));\r\n }\r\n\r\n // @ts-ignore\r\n const products = props.data.products.result;\r\n console.log(props.data)\r\n const existingPoints:string[] = [];\r\n const existingPointIds:string[] = [];\r\n const _activePoints: IArea[] = [];\r\n const _activeImageClass = `msc-active-image-${getActiveImageId(props.config)}`;\r\n const addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\r\n if (!area) {\r\n _activePoints.push({\r\n areaId: product.RecordId.toString(),\r\n coords,\r\n primaryImageUrl: product.PrimaryImageUrl ?? '',\r\n productUrl,\r\n productSearchResult: product\r\n });\r\n }\r\n };\r\n products && products.map((product: ProductSearchResult) => {\r\n existingPoints.push(product.RecordId.toString());\r\n product.ItemId && existingPointIds.push(product.ItemId);\r\n console.log(existingPoints);\r\n const defaultPosition: number = 0;\r\n if(props.config.activePoints) {\r\n for (const configProduct of props.config.activePoints) {\r\n if (isNaN(Number(configProduct.itemId)) ? product.ItemId === configProduct.itemId : product.RecordId === Number(configProduct.itemId)) {\r\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, props.context.actionContext, undefined);\r\n const coords = [\r\n configProduct.xPosition ?? defaultPosition,\r\n configProduct.yPosition ?? defaultPosition,\r\n configProduct.radius ?? defaultPosition\r\n ];\r\n const area = _activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\r\n addActivePoints(area, product, coords, productUrl);\r\n }\r\n }\r\n }\r\n });\r\n\r\n const imageMapperExt = React.cloneElement(props.imageMapper as React.ReactElement, {areaMap: {name: `map-${_activeImageClass}`, areas: _activePoints}});\r\n\r\n return (\r\n \r\n \r\n
\r\n {imageMapperExt}\r\n { props.config.activePoints && props.config.activePoints.map((activePoint, index) => {\r\n if(activePoint.itemId && (existingPoints.includes(activePoint.itemId) || existingPointIds.includes(activePoint.itemId)) && activePoint.xPosition && activePoint.yPosition && props.config.activeImage && props.config.activeImage.width && props.config.activeImage.height){\r\n const leftP = activePoint.xPosition * 100 / props.config.activeImage.width;\r\n const topP = activePoint.yPosition * 100 / props.config.activeImage.height;\r\n \r\n return(\r\n \r\n )\r\n }\r\n return;\r\n })\r\n }\r\n
\r\n \r\n {props.title}\r\n {props.text}\r\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\r\n \r\n {props.links}\r\n \r\n \r\n
\r\n\r\n \r\n {props.overlay}\r\n {props.productCard}\r\n \r\n
\r\n );\r\n};\r\n\r\nconst getActiveImageId = (config: IActiveImageConfig) => {\r\n const { activeImage } = config;\r\n let activeImageId: string = '';\r\n if (activeImage?.src) {\r\n const activeImageSource = activeImage.src.split('/');\r\n const decrementOne: number = 1;\r\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\r\n activeImageId = activeImageIdPart[0] ?? '';\r\n }\r\n return activeImageId;\r\n};\r\n\r\nexport default activeImageView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['active-image'] = {\n c: () => require('@msdyn365-commerce-modules/active-image/dist/lib/modules/active-image/active-image'),\n $type: 'contentModule',\n da: [{name:'products', path:'@msdyn365-commerce-modules/active-image/dist/lib/modules/actions/get-active-image-products', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'active-image',\n p: 'active-image',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/active-image/dist/lib/modules/active-image'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/active-image/dist/lib/modules/actions/get-active-image-products';\n let dataAction = require('@msdyn365-commerce-modules/active-image/dist/lib/modules/actions/get-active-image-products');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|loacker|views|active-image'] = {\n c: () => require('partner/themes/loacker/views/active-image.view.tsx'),\n cn: '__local__-__local__-active-image'\n };\nviewDictionary['@msdyn365-commerce-modules|active-image|modules|active-image|active-image'] = {\n c: () => require('@msdyn365-commerce-modules/active-image/dist/lib/modules/active-image/active-image.view.js'),\n cn: '@msdyn365-commerce-modules-active-image-active-image'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { ProductLookupClause, ProductsDataActions, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IActiveImageConfig, IActivePointsData } from '../active-image';\n\n/**\n * ActiveImageInput.\n */\nexport class ActiveImageInput implements IActionInput {\n public config: IActiveImageConfig;\n\n private readonly _cacheKey: string = 'ActiveImage';\n\n public constructor(config: IActiveImageConfig) {\n this.config = config;\n\n if (this.config.activePoints && ArrayExtensions.hasElements(this.config.activePoints)) {\n for (const activePointData of this.config.activePoints) {\n if (activePointData.itemId) {\n this._cacheKey = `${this._cacheKey}-${activePointData.itemId.toString()}`;\n }\n }\n }\n }\n\n /**\n * GetCacheObjectType.\n * @returns - Returns string.\n */\n public getCacheObjectType = (): string => 'ActiveImageFullProductSearchResult';\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => this._cacheKey;\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * CreateInput.\n * @param inputData - IActionContext.\n * @returns - IActionInput.\n */\nexport const createInput = (inputData: ICreateActionContext): IActionInput => {\n return new ActiveImageInput(inputData.config as IActiveImageConfig);\n};\n\n/**\n * Action.\n * @param input - ActiveImageInput.\n * @param context - IActionContext.\n * @returns - ProductSearchResult[].\n */\nexport const getActiveImageproductAction = async (input: ActiveImageInput, context: IActionContext): Promise => {\n const { config } = input;\n const itemIds: ProductLookupClause[] = [];\n if (config.activePoints) {\n config.activePoints.map((activePointData: IActivePointsData) => itemIds.push({ ItemId: activePointData.itemId }));\n }\n const searchCriteriaInput: ProductSearchCriteria = {};\n const catalogId = getCatalogId(context.requestContext);\n validateCatalogId(catalogId);\n\n searchCriteriaInput.Context = {\n ChannelId: context.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n };\n searchCriteriaInput.IncludeAttributes = true;\n searchCriteriaInput.ItemIds = itemIds;\n if (!config.activePoints || !ArrayExtensions.hasElements(config.activePoints)) {\n throw new Error('Fail to call ActiveImage API no active points configured.');\n }\n // eslint-disable-next-line no-return-await -- Disable because we want to return the promise.\n return await ProductsDataActions.searchByCriteriaAsync({ callerContext: context }, searchCriteriaInput);\n};\n\n/**\n * Action.\n * @param id - Id.\n * @param action - Action.\n * @returns - Results.\n */\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/active-image/get-active-image-products',\n action: getActiveImageproductAction as IAction,\n input: createInput\n});\n\nexport default actionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n \n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n \n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return ;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n
\n
\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n
\n
\n

{product.Name}

\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n
\n
\n \n );\n};\n\nexport default ActiveProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component {\n private readonly _backgroundImage: React.RefObject;\n\n private readonly _container: React.RefObject;\n\n private readonly _canvas: React.RefObject;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n \n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n
\n \n \n \n {this.renderAreas()}\n \n
\n );\n }\n}\n\nexport default ImageMapper;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject;\n\n public constructor(props: IActiveImageProps & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n \n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n \n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n
\n
\n {!this._isDesktopViewPort &&
\n
\n )}\n \n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort &&
};\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n \n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n \n {additionalContent.heading}\n \n {additionalContent.text}\n {additionalContent.links}\n \n \n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC = props => {\n return (\n \n \n {props.imageMapper}\n \n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n \n {props.links}\n \n \n \n \n {props.overlay}\n {props.productCard}\n \n \n );\n};\n\nexport default activeImageView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["activeImageView","props","hoverArea","event","index","_target$closest","_target$closest2","target","map","closest","getElementsByClassName","areas","dispatchEvent","MouseEvent","mapCtn","firstElement","firstChild","style","display","products","data","result","console","log","existingPoints","existingPointIds","_activePoints","_activeImageClass","getActiveImageId","config","addActivePoints","area","product","coords","productUrl","_product$PrimaryImage","push","areaId","RecordId","toString","primaryImageUrl","PrimaryImageUrl","productSearchResult","ItemId","activePoints","configProduct","isNaN","Number","itemId","_product$Name","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","getProductPageUrlSync","Name","context","actionContext","undefined","xPosition","yPosition","radius","find","activePoint","JSON","stringify","imageMapperExt","React","imageMapper","areaMap","name","Module","Object","assign","activePointContainer","Node","activePointDetailsContainer","className","includes","activeImage","width","height","leftP","topP","left","top","onMouseEnter","onClick","clickArea","_target$closest5","onTouchEnd","onMouseLeave","leaveArea","_target$closest3","_target$closest4","resources","seeMoreButtonText","detailsContainer","title","text","additionalContent","additionalContentNode","heading","additionalContentContainer","additionalContentItemLinks","links","detailsContainerCta","productCardtopPosition","productCardleftPosition","overlay","productCard","activeImageId","src","_activeImageIdPart$","activeImageSource","split","decrementOne","length","binding","modules","dataActions","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","id","window","__bindings__","_objectSpread","viewDictionary","cn","ActiveImageInput","constructor","_cacheKey","getCacheObjectType","getCacheKey","this","dataCacheType","ArrayExtensions","hasElements","activePointData","createInput","inputData","getActiveImageproductAction","async","input","itemIds","searchCriteriaInput","catalogId","getCatalogId","requestContext","validateCatalogId","Context","ChannelId","apiSettings","channelId","CatalogId","IncludeAttributes","ItemIds","ProductsDataActions","callerContext","actionDataAction","createObservableDataAction","action","renderRating","typeName","ratingId","avgRating","totalRatings","ariaLabel","_totalRatings$toStrin","numberRatings","ratingAriaLabel","rating","roundedRating","toFixed","format","getRatingAriaLabel","RatingComponent","ratingCount","readOnly","ActiveProductComponent","_ref","imageSettings","savingsText","freePriceText","originalPriceText","gridSettings","imageUrl","altText","imgData","imageProps","cropFocalRegion","Image","loadFailureBehavior","renderProductPlacementImage","request","productId","basePrice","adjustedPrice","price","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderPrice","Price","description","Description","app","hideRating","AverageRating","TotalRatings","assembleNode","item","_item$links","renderHeading","additionalContentHeading","Msdyn365","tag","editProps","onEdit","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","role","key","link","onTextChange","handleAdditionalLinkTextChange","activeImageAdditionalContent","CanvasCalculations","CanvasStyles","ImageMapper","super","_isDesktopViewPort","_context","getActiveImageWidth","MsDyn365","isBrowser","activeImageReferenceValue","activeImageRefs","current","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","parseInt","gValue","bValue","applyFadingTransition","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","fillStyle","document","body","parentElement","getAttribute","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","color","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","toLocaleLowerCase","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","Math","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","click","preventDefault","hoverOn","hoverOff","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","replace","shape","join","onFocus","onBlur","href","tabIndex","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","componentDidMount","componentDidUpdate","shouldComponentUpdate","nextProps","shouldRender","render","_requestContext$gridS","imageData","ref","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","updateClientWidth","viewport","isMobile","variant","VariantType","Browser","setState","renderImageMapper","_this$props$config$ac","productResults","mappedArea","state","enterArea","_activeImageRefs","altTextForSeeMoreButtonWithProductName","overlayClass","type","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","defaultImageSettings","getDefaultImageSettings","productImageSettingsWidth","viewports","lg","w","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","h","produtCardHight","_area$center$2","_area$center2","xs","q","xl","lazyload","keyDown","enterKey","nodeName","escKey","handleTextChange","value","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","payLoad","getPayloadObject","_telemetryContent","linkData","contentAction","etext","attributes","getTelemetryAttributes","linkId","willOpenInNewTab","additionalProperties","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","_handleOutsideClick","_this$_productCardDiv","contains","getTelemetryObject","telemetryPageName","friendlyName","telemetry","addEventListener","setTimeout","timeoutInterval","images","Array","from","removeAttribute","componentWillUnmount","removeEventListener","viewProps","moduleProps","classnames","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","renderView","_this$props$config$ad","module","exports","ReactDOM"],"sourceRoot":""}