{"version":3,"file":"static/js/9a75cf3fe27eee57667b.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/themes/mattressfirm/views/promo-banner.view.tsx?dbcd","webpack://mattressfirm/./lib/promo-banner/module-registration.js?d732","webpack://mattressfirm/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://mattressfirm/./src/modules/promo-banner/components/links.tsx?2587","webpack://mattressfirm/./src/modules/promo-banner/components/text.tsx?782b","webpack://mattressfirm/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://mattressfirm/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport {\r\n IBannerScheduleData,\r\n ICountdownScheduleData,\r\n IPromoBannerProps\r\n} from '../definition-extensions/promo-banner.ext.props.autogenerated';\r\n\r\n// countdown component\r\nimport Countdown, { CountdownRenderProps } from 'react-countdown';\r\n\r\n// used for date/time functionailty\r\nimport MsDyn365, { Link, ILinksData } from '@msdyn365-commerce/core';\r\nimport dayjs from 'dayjs';\r\nimport tz from 'dayjs/plugin/timezone';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport isBetween from 'dayjs/plugin/isBetween';\r\ndayjs.extend(tz);\r\ndayjs.extend(utc);\r\ndayjs.extend(isBetween);\r\nconst format = 'M/D/YYYY H:m:s';\r\n\r\nimport { IPromoBannerViewProps } from '@msdyn365-commerce-modules/promo-banner';\r\n\r\n// tslint:disable-next-line: max-func-body-length\r\nconst PromoBannerView: React.FC & IPromoBannerViewProps> = props => {\r\n const {\r\n promoBannerProps,\r\n promoBannerLinksProps,\r\n closeButton,\r\n carouselProps,\r\n config: { mfrmBannerMessages, bannerLimit }\r\n } = props;\r\n\r\n // VSI Customization - START\r\n\r\n const scheduledSlides: JSX.Element[] = [];\r\n // counter for the banner limit\r\n const adjustedBannerLimit = bannerLimit !== undefined ? bannerLimit : (mfrmBannerMessages && mfrmBannerMessages.length) || 0;\r\n let bannerCount = 0;\r\n\r\n mfrmBannerMessages &&\r\n mfrmBannerMessages.forEach((message, index) => {\r\n const bannersUnderLimit = adjustedBannerLimit - bannerCount;\r\n const bannerSchedule = message.bannerSchedule;\r\n\r\n // banner only follows schedule if enableBannerSchedule config is set to true\r\n const bannerShouldShow = bannerSchedule && bannerSchedule.enableBannerSchedule ? isScheduled(bannerSchedule) : true;\r\n\r\n // checks if banner is set to be enabled, is currently scheduled, and the banner limit hasn't been surpassed\r\n if (message.enableBanner && bannersUnderLimit && bannerShouldShow) {\r\n const countdownSchedule = message.countdownSchedule;\r\n bannerCount++;\r\n\r\n // add countdown to richText if required\r\n const parsedRichText = message.richText && ReactHtmlParser(message.richText.toString());\r\n\r\n // add countdown component into richText\r\n countdownSchedule && parsedRichText && countdownSchedule.enableCountdown && setCountDown(countdownSchedule, parsedRichText);\r\n\r\n const editableLink: ILinksData = {\r\n ariaLabel: message.links![0].ariaLabel,\r\n className: 'ms-promo-banner__link',\r\n linkText: message.links![0].linkText,\r\n openInNewTab: message.links![0].openInNewTab,\r\n role: 'link',\r\n linkUrl: message.links![0].linkUrl.destinationUrl\r\n };\r\n\r\n const promoBannerParentDivRef = React.useRef();\r\n React.useEffect(() => {\r\n promoBannerParentDivRef.current &&\r\n promoBannerParentDivRef.current.addEventListener('click', function(event: React.MouseEvent) {\r\n event.preventDefault();\r\n if ('utag' in window) {\r\n const eventLabel = `${htmltoText(message.richText?.toString()!).trim()}`;\r\n // @ts-ignore\r\n utag.link({\r\n event: 'pencil banner tracking',\r\n event_category: 'pencil banner tracking',\r\n event_action: 'pencil banner click',\r\n event_label: eventLabel,\r\n event_noninteraction: 'false'\r\n });\r\n }\r\n if (MsDyn365.isBrowser) {\r\n window.location.href = message.links![0].linkUrl.destinationUrl;\r\n }\r\n });\r\n }, []);\r\n\r\n scheduledSlides.push(\r\n \r\n \r\n {message.richText &&
{parsedRichText}
}\r\n {message.links && message.links.length > 0 && }\r\n
\r\n
\r\n );\r\n }\r\n });\r\n\r\n // override the _next() and _prev() functions from promo-banner.tsx to only count scheduled slides instead of all slides when determining first and last slides\r\n carouselProps.next = (): void => {\r\n const isLastItem = props.activeIndex === scheduledSlides.length - 1;\r\n const nextIndex = isLastItem ? 0 : props.activeIndex + 1;\r\n // sets the index for the next button. equivalent to _goToIndex() from promo-banner.tsx\r\n carouselProps.onIndicatorsClickHandler(nextIndex);\r\n };\r\n\r\n carouselProps.previous = (): void => {\r\n const isFirstItem = props.activeIndex === 0;\r\n const nextIndex = isFirstItem ? (mfrmBannerMessages ? scheduledSlides.length - 1 : 0) : props.activeIndex - 1;\r\n carouselProps.onIndicatorsClickHandler(nextIndex);\r\n };\r\n\r\n if(MsDyn365.isBrowser){\r\n const nextFlippers = document.querySelectorAll('.msc-carousel__control__next');\r\n const prevFlippers = document.querySelectorAll('.msc-carousel__control__prev');\r\n if(nextFlippers.length && prevFlippers.length){\r\n nextFlippers.forEach((nextFlipper)=>{\r\n nextFlipper.removeAttribute('href');\r\n });\r\n prevFlippers.forEach((prevFlipper)=>{\r\n prevFlipper.removeAttribute('href');\r\n });\r\n }\r\n }\r\n return (\r\n \r\n } />\r\n {closeButton}\r\n \r\n );\r\n};\r\n\r\n// strips content inside given element\r\nconst clearContent = (parsedRichText: React.ReactElement[]): void => {\r\n // find countdown element and clear its content\r\n for (let i = 0; i < parsedRichText.length; i++) {\r\n const element = parsedRichText[i];\r\n const classNames = element.props.className && element.props.className.split(' ');\r\n if (classNames && classNames.includes('countdown')) {\r\n element.props.children.length = 0;\r\n return;\r\n }\r\n }\r\n};\r\n\r\n// adds Countdown component as a child of the element with the id 'countdown' is countdown should show\r\nconst setCountDown = (countdownSchedule: ICountdownScheduleData, parsedRichText: React.ReactElement[]): void => {\r\n // check if countdown is scheduled to show\r\n if (!isScheduled(countdownSchedule)) {\r\n return;\r\n }\r\n\r\n // clear content inside 'countdown' element\r\n clearContent(parsedRichText);\r\n\r\n const endDate = countdownSchedule.endDate;\r\n const endTime = countdownSchedule.endTime;\r\n const scheduleEnd = dayjs(`${endDate} ${endTime}`, format);\r\n const scheduleEndLocal = scheduleEnd && convertToLocal(scheduleEnd, countdownSchedule);\r\n\r\n const renderer = ({ formatted }: CountdownRenderProps) => {\r\n return (\r\n \r\n {formatted.hours}:{formatted.minutes}:\r\n {formatted.seconds}\r\n \r\n );\r\n };\r\n\r\n const countdown = scheduleEndLocal && ;\r\n\r\n // find target and put countdown inside of it\r\n parsedRichText.forEach(element => {\r\n const classNames = element.props.className && element.props.className.split(' ');\r\n if (classNames && classNames.includes('countdown')) {\r\n element.props.children.push(countdown);\r\n return;\r\n }\r\n });\r\n};\r\n\r\n// checks if countdown/banner is currently scheduled\r\nconst isScheduled = (schedule: ICountdownScheduleData | IBannerScheduleData): Boolean => {\r\n let start = schedule.startDate && schedule.startTime && dayjs(`${schedule.startDate} ${schedule.startTime}`, format);\r\n let end = schedule.endDate && schedule.endTime && dayjs(`${schedule.endDate} ${schedule.endTime}`, format);\r\n\r\n // check if schedule is valid\r\n const validStart = start && start.isValid();\r\n const validEnd = end && end.isValid();\r\n\r\n if (!validStart || !validEnd) {\r\n return false;\r\n }\r\n\r\n const now = dayjs();\r\n\r\n // convert to local time\r\n start = start && convertToLocal(start, schedule);\r\n end = end && convertToLocal(end, schedule);\r\n\r\n return now.isBetween(start, end);\r\n};\r\n\r\n// convert time to local time\r\nconst convertToLocal = (time: dayjs.Dayjs, schedule: ICountdownScheduleData | IBannerScheduleData): dayjs.Dayjs | undefined => {\r\n const timeZone = schedule.timeZone && getTimeZone(schedule.timeZone);\r\n\r\n return !timeZone\r\n ? time\r\n : dayjs(time.format(format), format)\r\n .tz(timeZone)\r\n .local();\r\n};\r\n\r\n// convert timezone choice to matching timezone in moment-timezone\r\nconst getTimeZone = (timeZone: string): string | undefined => {\r\n switch (timeZone) {\r\n case 'hawaii':\r\n return 'America/Adak';\r\n case 'alaska':\r\n return 'America/Anchorage';\r\n case 'pacific':\r\n return 'America/Los_Angeles';\r\n case 'mountain':\r\n return 'America/Denver';\r\n case 'central':\r\n return 'America/Chicago';\r\n case 'eastern':\r\n return 'America/New_York';\r\n default:\r\n return undefined;\r\n }\r\n};\r\n\r\nconst htmltoText = (html: string) => {\r\n if (MsDyn365.isBrowser) {\r\n // Create a new div element\r\n const tempDivElement = document.createElement('div');\r\n\r\n // Set the HTML content with the given value\r\n // tslint:disable-next-line: no-inner-html\r\n tempDivElement.innerHTML = html;\r\n\r\n // Retrieve the text property of the element\r\n return tempDivElement.textContent || tempDivElement.innerText || '';\r\n } else {\r\n return '';\r\n }\r\n};\r\n\r\n// VSI Customization - END\r\n\r\nexport default PromoBannerView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n (binding.modules['promo-banner'] = {\n c: () => require('@msdyn365-commerce-modules/promo-banner/dist/lib/modules/promo-banner/promo-banner'),\n $type: 'contentModule',\n da: [],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'promo-banner',\n p: 'promo-banner',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/promo-banner/dist/lib/modules/promo-banner'\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|mattressfirm|views|promo-banner'] = {\n c: () => require('partner/themes/mattressfirm/views/promo-banner.view.tsx'),\n cn: '__local__-__local__-promo-banner'\n };\nviewDictionary['@msdyn365-commerce-modules|promo-banner|modules|promo-banner|promo-banner'] = {\n c: () => require('@msdyn365-commerce-modules/promo-banner/dist/lib/modules/promo-banner/promo-banner.view.js'),\n cn: '@msdyn365-commerce-modules-promo-banner-promo-banner'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n\n}\n\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n \n {label}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n \n {editableLinks && editableLinks.length > 0 ? : null}\n \n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\n return (\n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps ;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent>}\n */\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && \n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides = bannerMessages && bannerMessages.map((message, index) => {\n return (\n \n \n {promoBannerText}\n \n {message.text && }\n {message.links && message.links.length > 0 && }\n \n );\n });\n\n return (\n \n \n {closeButton}\n \n );\n};\nexport default PromoBannerView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["dayjs","tz","utc","isBetween","format","setCountDown","countdownSchedule","parsedRichText","isScheduled","i","length","element","classNames","props","className","split","includes","children","clearContent","endDate","endTime","scheduleEnd","scheduleEndLocal","convertToLocal","countdown","React","Countdown","date","toDate","daysInHours","renderer","formatted","hours","minutes","seconds","forEach","push","schedule","start","startDate","startTime","end","validStart","isValid","validEnd","now","time","timeZone","getTimeZone","local","htmltoText","html","MsDyn365","tempDivElement","document","createElement","innerHTML","textContent","innerText","promoBannerProps","promoBannerLinksProps","closeButton","carouselProps","config","mfrmBannerMessages","bannerLimit","scheduledSlides","adjustedBannerLimit","undefined","bannerCount","message","index","bannersUnderLimit","bannerSchedule","bannerShouldShow","enableBannerSchedule","enableBanner","richText","ReactHtmlParser","toString","enableCountdown","editableLink","ariaLabel","links","linkText","openInNewTab","role","linkUrl","destinationUrl","promoBannerParentDivRef","current","addEventListener","event","preventDefault","window","eventLabel","trim","utag","link","event_category","event_action","event_label","event_noninteraction","location","href","Node","ref","key","Link","Object","next","nextIndex","activeIndex","onIndicatorsClickHandler","previous","nextFlippers","querySelectorAll","prevFlippers","nextFlipper","removeAttribute","prevFlipper","Module","items","binding","modules","dataActions","c","require","$type","da","iNM","ns","n","p","pdp","md","__bindings__","viewDictionary","cn","PromoBannerCloseButton","closeButtonAriaLabel","label","telemetryContent","onClose","payLoad","getPayloadObject","TelemetryConstant","attributes","getTelemetryAttributes","onClick","PromoBannerLinks","requestContext","onTextChange","editableLinks","_mapEditableLinks","Msdyn365","editProps","linkdata","contentAction","etext","additionalProperties","onTelemetryClick","PromoBannerText","text","tag","onEdit","PromoBanner","constructor","state","animating","isVisible","getTelemetryObject","this","context","request","telemetryPageName","friendlyName","telemetry","handleTextChange","bannerMessages","target","value","handleLinkTextChange","linkIndex","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","setState","_onDismiss","render","dismissEnabled","interval","hideFlipper","autoplay","closeButtonLabel","bannerText","resources","error","viewProps","classnames","onDismiss","handleLinks","handleText","moduleProps","promoBannerTextProps","contentProps","promoBannerText","Carousel","hideIndicator","renderView","slides","map","module","exports","ReactDOM"],"sourceRoot":""}