{"version":3,"sources":["webpack:///./presentation/utils/ribbonPadding.ts","webpack:///./presentation/hocs/errorBoundary.tsx","webpack:///./presentation/hocs/withRibbonImpression.ts","webpack:///./presentation/utils/ribbonWidth.ts","webpack:///./presentation/hocs/deepLink.tsx","webpack:///./presentation/components/ribbons/Ribbon/Ribbon.tsx","webpack:///./presentation/components/ribbons/Ribbon/ConnectedRibbon.ts","webpack:///./presentation/components/ribbons/Ribbon/index.ts","webpack:///./presentation/components/Shortcode/PendingShortcode.tsx","webpack:///./presentation/components/Shortcode/Alt.tsx","webpack:///./presentation/components/Shortcode/Bold.tsx","webpack:///./presentation/components/Shortcode/Italic.tsx","webpack:///./presentation/components/Shortcode/Link.tsx","webpack:///./presentation/components/Shortcode/Text.tsx","webpack:///./presentation/components/Shortcode/Tooltip.tsx","webpack:///./presentation/components/Shortcode/Shortcode.tsx","webpack:///./presentation/components/Shortcode/index.ts","webpack:///./presentation/hocs/visibilitySet.tsx","webpack:///./presentation/utils/urlLanguageParse.ts","webpack:///./presentation/utils/createImageAlt.ts","webpack:///./presentation/components/common/CallToAction.tsx","webpack:///./domain/constants/callToAction.ts","webpack:///./presentation/hocs/callToAction.js","webpack:///./domain/constants/imageAspectRatio.ts","webpack:///./presentation/utils/imageAspectRatioPercentage.ts","webpack:///./presentation/utils/createImageUrl.ts"],"names":["spacing","isMinSm","isMinLg","layout","flush","r","shrinkLeading","shrinkTrailing","getPaddingSize","shrinkSide","isFlush","leading","Flush","LEADING","trailing","TRAILING","paddingTop","gu2px","paddingBottom","stylesheet","theme","colorway","isMinMd","useStyles","default","root","backgroundColor","getBackgroundColor","color","getTitleColor","ribbonPadding","cssSides","Side","X","textAlign","WrappedComponent","ErrorBoundary","styles","style","id","props","compose","withState","lifecycle","componentDidCatch","this","setHasErrored","withProps","hooksA","pipe","mapProps","selector","useMemo","getRibbonAnalytics","analytics","useSelector","dispatch","useDispatch","actions","bindActionCreators","sendImpression","withHandlers","onImpression","name","type","ribbonName","ribbonType","hooksB","isFullyInViewport","stopWatcher","useEffect","pureEnhance","hocs","mapPropsHoc","branch","Watch","deepLink","withRouter","componentDidMount","location","hash","scrollWhenReady","loading","animationComplete","setTimeout","scroller","scrollTo","duration","delay","smooth","mapFit","fit","Fit","FULLSCREEN","minHeight","FILL","flex","flexBasis","AUTO","height","isFinite","enhance","hooks","targetRef","useRef","withBreakpointsHook","palette","duoLayout","activeFit","findResponsiveItem","getBreakpoints","padding","duoLayoutFlex","duoRibbonWidth","position","display","flexDirection","width","percentage","inner","ribbon","modifier","Colorway","PRIMARY_GRADIENT","backgroundImage","primary","primaryGradient","children","ref","withRibbonImpression","Ribbon","randomWidth","Math","floor","random","puree","code","against","lines","elements","RecursiveShortcode","rest","tertiary","fontWeight","fontStyle","getUsfConfig","wlSelectors","getAppConfig","mapStateToProps","connect","contentType","attributes","externalRoutes","to","goto","analyticskey","size","TextButtonSize","INHERIT","escapeShortCodes","nl2br","string","split","map","reduce","prev","cur","i","key","text","newline","isFalse","formatText","ReactTooltip","lazy","eventToggle","CallToAction","label","fallback","tagName","useDefaultStyles","content","maxWidth","Glyph","Sup","List","OrderedList","ListItem","TickListItem","ProductPrice","PhoneNumber","Shortcode","element","genericShortcodeHandler","shortcodeName","Component","String","getAgainst","Element","nuller","Text","Italic","Bold","Alt","Link","Tooltip","glyph","PendingShortcode","BaseComponent","url","language","length","parsedLanguage","toUpperCase","join","replace","hasImage","isNotNilOrEmpty","getImageName","str","image","match","formatName","callToAction","defaultProps","Against","LIGHT","kind","addingStatus","handleClick","status","Status","PENDING","SUCCESS","FAILURE","DEFAULT","buttonProps","onClick","Behavior","formatPricingTier","tier","paymentInterval","term","behavior","state","buttonId","ribbonId","index","getExternalRoutes","getRibbon","product","ribbonList","createRibbonName","getAddingStatus","addToBasket","applyVoucher","setVisibility","openReduxModal","signals","open","productClicked","promotionClicked","productAddToBasket","stateProps","dispatchProps","ownProps","window","useWindow","handleAnalytics","ctaType","list","productId","promotion","handleAddToBasketClick","postAction","pricingTier","productData","skuId","defaultSkuId","price","selectors","getPrice","includeTax","category","categoryName","handleNavigateClick","handleApplyVoucherClick","voucherCode","handleConfigureClick","query","URLSearchParams","append","q","toString","href","handleSetVisibilityClick","visibilitySet","handlePlayVideoClick","videoId","provider","route","params","ownerProps","ADD_TO_BASKET","APPLY_VOUCHER","CONFIGURE","PLAY_VIDEO","SET_VISIBILITY","NAVIGATION","linkAttribution","ImageAspectRatio","imageAspectRatioPercentage","ratio","W16H9","W4H3","W1H1","W32H9","W64H9","W3H4","W9H16","W9H32","hasIllustration","media","currentLanguage","createPaintbrushUrl","illustration","urlLanguageParse","imageUrl"],"mappings":"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","file":"pex-static/16/1.3075309ea725ccea3b53.chunk.js","sourcesContent":["import { Flush } from 'domain/constants/ribbons';\nimport { gu2px } from '@ux/theme-utils';\nimport * as r from 'ramda';\nimport { Layout } from 'domain/constants/layout';\n\nexport default ({\n spacing,\n isMinSm,\n isMinLg,\n layout,\n flush,\n}: {\n spacing: number,\n isMinSm: boolean,\n isMinLg: boolean,\n layout?: Layout,\n flush?: Flush|boolean,\n}) => {\n\n if (r.equals(flush, true)) {\n // Component will handle all padding, used on full bleed image ribbons\n return {};\n }\n\n const {\n //@ts-ignore\n shrinkLeading,\n //@ts-ignore\n shrinkTrailing,\n } = r.defaultTo({}, layout);\n\n /*\n shrinkSide:\n shrink[Leading/Trailing] prop is true then return a reduced padding\n depending on screen size\n isFlush:\n leading or trailing edge has been designated as flush, no padding\n */\n const getPaddingSize = (shrinkSide: string, isFlush: boolean) => {\n\n if (isFlush) {\n return 0;\n }\n\n return r.cond([\n [ r.propEq(shrinkSide, true), () => r.ifElse(\n r.equals(true),\n r.always(1),\n r.always(0.5),\n )(isMinSm) ],\n [ r.propEq('isMinLg', true), r.always(6) ],\n [ r.propEq('isMinSm', true), r.always(5) ],\n [ r.T, r.always(4) ],\n ])({\n isMinLg,\n isMinSm,\n shrinkLeading,\n shrinkTrailing,\n });\n };\n\n const leading = getPaddingSize('shrinkLeading', flush === Flush.LEADING);\n const trailing = getPaddingSize('shrinkTrailing', flush === Flush.TRAILING);\n\n return {\n paddingTop: gu2px(leading, spacing),\n paddingBottom: gu2px(trailing, spacing),\n };\n};\n","import React, { CSSProperties } from 'react';\nimport {\n compose,\n lifecycle,\n withState,\n withProps,\n} from 'recompose';\nimport Message from '@ux/message';\nimport { Container } from '@ux/grid';\nimport * as r from 'ramda';\nimport cssSides, { Side } from '@team-griffin/css-sides';\nimport {\n getBackgroundColor,\n getTitleColor,\n} from 'presentation/utils/colorway';\nimport { gu2px, Theme } from '@ux/theme-utils';\nimport ribbonPadding from 'presentation/utils/ribbonPadding';\nimport { useStyles } from '@team-griffin/stylr';\nimport { Colorway } from 'domain/constants/colorway';\nimport { Layout } from 'domain/constants/layout';\nimport { Flush } from 'domain/constants/ribbons';\nimport { BreakpointProps } from '@ux/responsive';\ninterface OuterProps extends BreakpointProps {\n theme: Theme,\n colorway: Colorway,\n layout: Layout,\n flush?: Flush|boolean,\n}\n\ninterface InnerProps extends OuterProps {\n styles: {\n root: CSSProperties,\n }\n hasErrored: boolean,\n}\nconst stylesheet = ({\n theme,\n colorway,\n isMinSm,\n isMinMd,\n isMinLg,\n layout,\n flush,\n}: InnerProps) => {\n const {\n spacing,\n } = theme;\n\n return useStyles({\n default: {\n root: {\n backgroundColor: getBackgroundColor(theme, colorway),\n color: getTitleColor(theme, colorway),\n ...ribbonPadding({\n spacing,\n isMinSm,\n isMinLg,\n layout,\n flush,\n }),\n ...cssSides('Side', Side.X, gu2px(3, spacing)),\n textAlign: 'center',\n },\n },\n isMinSm: {\n root: {\n ...cssSides('Side', Side.X, gu2px(4, spacing)),\n },\n },\n }, [\n { colorway },\n { isMinSm },\n { isMinMd },\n ]);\n};\n\nexport default (WrappedComponent: any) => {\n const ErrorBoundary = r.ifElse(\n r.propEq('hasErrored', true),\n ({ styles }) => (\n
\n \n \n \n
\n ),\n (props: InnerProps) => (\n \n ),\n );\n\n return compose(\n withState('hasErrored', 'setHasErrored', false),\n lifecycle({\n componentDidCatch: function() {\n //@ts-ignore\n this.props.setHasErrored(true);\n },\n }),\n withProps(stylesheet),\n )(ErrorBoundary);\n};\n","import { useMemo, useEffect } from 'react';\nimport { branch, mapProps as mapPropsHoc } from 'recompose';\nimport pureEnhance from '@ux/pure-enhance';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { pipe, withProps, mapProps, withHandlers } from '@team-griffin/rehook';\nimport { Watch } from 'scrollmonitor-react';\nimport * as r from 'ramda';\nimport { sendImpression } from 'application/signals/ribbons';\nimport { getRibbonAnalytics } from 'domain/selectors/ribbons';\nimport { Type } from 'domain/constants/ribbons';\n\nconst hooksA = pipe(\n mapProps((props: any) => {\n const { id } = props;\n const selector = useMemo(() => getRibbonAnalytics(id), [ id ]);\n const analytics = useSelector(selector);\n const dispatch = useDispatch();\n const actions = bindActionCreators({ sendImpression }, dispatch);\n\n return r.mergeDeepLeft(props, {\n analytics,\n actions,\n });\n }),\n withHandlers({\n onImpression: ({\n name,\n type,\n analytics,\n actions: {\n sendImpression,\n },\n }: {\n name: string,\n type: Type,\n analytics: any,\n actions: {\n sendImpression: Function,\n }\n }) => () => sendImpression({\n ...analytics,\n ribbonName: name,\n ribbonType: type,\n }),\n }),\n);\n\nconst hooksB = pipe(\n withProps(({\n isFullyInViewport,\n stopWatcher,\n onImpression,\n analytics,\n }: {\n isFullyInViewport: boolean,\n stopWatcher: () => void,\n onImpression: (a: any) => void,\n analytics: any,\n }) => {\n useEffect(() => {\n if (isFullyInViewport) {\n stopWatcher();\n onImpression(analytics);\n }\n }, [ isFullyInViewport ]);\n }),\n);\n\nexport default pureEnhance('RibbonImpression', {\n hocs: [\n mapPropsHoc(hooksA),\n branch(\n r.propSatisfies(r.complement(r.isNil), 'analytics'),\n Watch,\n ),\n mapPropsHoc(hooksB),\n ],\n});\n","export const duoRibbonWidth = ({\n isMinMd,\n duoLayout,\n}: {\n isMinMd: boolean,\n duoLayout?: boolean,\n}) => {\n if (!isMinMd || duoLayout == null) {\n return {};\n }\n\n const flexSize = (isMinMd && duoLayout) ? 50 : 100;\n return {\n flex: `${flexSize}%`,\n };\n};\n\nexport default null;","import React, { Fragment } from 'react';\nimport {\n compose,\n lifecycle,\n} from 'recompose';\nimport { withRouter } from 'react-router';\nimport { Element, scroller } from 'react-scroll';\n\nconst deepLink = compose(\n withRouter,\n lifecycle({\n componentDidMount: function() {\n //Adding some ts-ignores here so it doesn't throw not recognizing\n //this.props\n\n //@ts-ignore\n if (this.props.location.hash === `#${this.props.name}`) {\n const scrollWhenReady = () => {\n // we can't scroll to eagerly or we'll end up in the wrong place\n //@ts-ignore\n if (this.props.loading || !this.props.animationComplete) {\n return setTimeout(scrollWhenReady, 100);\n }\n //@ts-ignore\n scroller.scrollTo(this.props.name, {\n duration: 500,\n delay: 100,\n smooth: true,\n });\n };\n setTimeout(scrollWhenReady, 100);\n }\n },\n }),\n (WrappedComponent: any) => {\n return (props: any) => (\n \n \n \n \n );\n },\n);\n\nexport default deepLink;\n","import React, { useRef, useLayoutEffect, CSSProperties, ReactNode, Ref } from 'react';\nimport { withProps } from '@team-griffin/rehook';\nimport pureEnhance from '@ux/pure-enhance';\nimport { withBreakpointsHook, BreakpointProps } from '@ux/responsive';\nimport findResponsiveItem from 'presentation/utils/findResponsiveItem';\nimport getBreakpoints from 'presentation/utils/getBreakpoints';\nimport ribbonPadding from 'presentation/utils/ribbonPadding';\nimport { duoRibbonWidth } from 'presentation/utils/ribbonWidth';\nimport { percentage, modifier } from '@ux/style-utils';\nimport deepLink from 'presentation/hocs/deepLink';\nimport { getBackgroundColor } from 'presentation/utils/colorway';\nimport { useStyles } from '@team-griffin/stylr';\nimport { Colorway } from 'domain/constants/colorway';\nimport { Fit, Flush, RibbonProps } from 'domain/constants/ribbons';\nimport * as r from 'ramda';\n\nexport {\n Flush,\n};\n\ninterface OuterProps extends RibbonProps {\n children?: ReactNode,\n}\ninterface WithHandlerProps extends OuterProps {\n setAnimationComplete: Function,\n setRibbonHeight: Function,\n setHeight: Function,\n onAnimationEnd: (props: {\n newHeight: number;\n }) => void,\n}\n\ninterface InnerProps extends WithHandlerProps, BreakpointProps {\n rendered: boolean,\n targetRef: Ref,\n duration: number,\n styles: {\n root: CSSProperties,\n inner: CSSProperties,\n ribbon: CSSProperties,\n }\n}\n\nconst mapFit = (fit: Fit) => r.cond([\n [ r.equals(Fit.FULLSCREEN), r.always({\n minHeight: '100vh',\n }) ],\n [ r.equals(Fit.FILL), r.always({\n flex: 1,\n flexBasis: 'auto',\n }) ],\n [ r.equals(Fit.AUTO), r.always({\n height: 'auto',\n }) ],\n [ isFinite, r.always({\n minHeight: fit,\n }) ],\n [ r.T, r.always({\n height: 'auto',\n }) ],\n])(fit);\n\nconst stylesheet = ({\n theme,\n colorway,\n loading,\n layout,\n flush,\n ...props\n}: InnerProps) => {\n const {\n palette,\n spacing,\n } = theme;\n const {\n //@ts-ignore\n fit,\n } = r.defaultTo({}, layout);\n\n const {\n isMinSm,\n isMinMd,\n isMinLg,\n duoLayout,\n } = props;\n\n const activeFit = findResponsiveItem(\n getBreakpoints(props),\n fit,\n );\n\n const padding = ribbonPadding({\n spacing,\n isMinSm,\n isMinLg,\n layout,\n flush,\n });\n\n const duoLayoutFlex = duoRibbonWidth({\n isMinMd,\n duoLayout,\n });\n\n return useStyles({\n default: {\n root: {\n backgroundColor: getBackgroundColor(theme, colorway),\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: percentage(100),\n ...mapFit(activeFit),\n ...padding,\n ...duoLayoutFlex,\n },\n inner: {\n flex: 1,\n flexBasis: 'auto',\n display: 'flex',\n height: 'auto',\n },\n ribbon: {\n display: 'flex',\n flexDirection: 'column',\n width: percentage(100),\n },\n },\n\n [modifier('colorway', Colorway.PRIMARY_GRADIENT)]: {\n root: {\n backgroundImage: `linear-gradient(to right, ${palette.primary}, ${palette.primaryGradient})`,\n },\n },\n }, [\n { loading },\n { colorway },\n { isMinSm },\n { isMinMd },\n { isMinLg },\n ]);\n};\n\nexport const PureRibbon = ({\n styles,\n targetRef,\n children,\n}: InnerProps) => (\n
\n
\n \n {children}\n
\n \n
\n);\n\nexport const enhance = pureEnhance('Ribbon', {\n hocs: [\n deepLink,\n ],\n hooks: [\n withProps(() => {\n const targetRef = useRef({});\n\n if (process.env.NODE_ENV !== 'production') {\n useLayoutEffect(() => {\n // when backstop runs on ribbons, this lets us filter out a lot of false\n // positives and a lot of race condition fails by only initialising\n // the snapshot once loading has finished + a delay to wait for fonts etc to load\n // eslint-disable-next-line\n setTimeout(() => {\n // eslint-disable-next-line\n console.log('BACKSTOP_RIBBON_READY');\n }, 3000);\n }, [ targetRef.current ]);\n }\n\n return {\n targetRef,\n };\n }),\n withBreakpointsHook,\n withProps(stylesheet),\n ],\n});\n\nexport default enhance(PureRibbon);\n","import pureEnhance from '@ux/pure-enhance';\nimport withRibbonImpression from 'presentation/hocs/withRibbonImpression';\n\nimport Ribbon from './Ribbon';\n\nconst enhance = pureEnhance('ConnectedRibbon', {\n hocs: [ withRibbonImpression ],\n});\n\nexport default enhance(Ribbon);\n","import Ribbon from './ConnectedRibbon';\nimport { Flush } from './Ribbon';\n\nexport { Flush };\n\nexport default Ribbon;\n","import React from 'react';\nimport { puree, GetInnerProps } from '@ux/pure-enhance';\nimport Shimmer from '@ux/shimmer';\nimport { ShortcodeProps } from './';\nimport { Colorway } from '@ux/theme-utils';\n\nexport interface OuterProps {\n against?: Colorway,\n code: ShortcodeProps,\n}\n\n// random % width for shimmer betwen 50% and 95%\nconst randomWidth = () => Math.floor((Math.random() * (95 - 50)) + 50);\n\nconst enhance = puree('PendingShortcode')();\n\ntype InnerProps = GetInnerProps;\n\nconst PurePendingShortcode = ({\n code,\n against,\n}: InnerProps) => (\n \n \n \n);\n\nexport default enhance(PurePendingShortcode);\n","import React from 'react';\nimport * as r from 'ramda';\nimport pureEnhance from '@ux/pure-enhance';\nimport { RecursiveShortcodeProps } from './Shortcode';\n\nexport default pureEnhance(\n 'Alt',\n)(({\n RecursiveShortcode,\n elements,\n theme,\n against,\n ...rest\n}) => (\n \n \n \n));\n","import React from 'react';\nimport { RecursiveShortcodeProps } from './Shortcode';\nimport pureEnhance from '@ux/pure-enhance';\n\nexport default pureEnhance(\n 'Bold',\n)(({ elements, RecursiveShortcode, ...rest }) => (\n \n \n \n));\n","import React from 'react';\nimport pureEnhance from '@ux/pure-enhance';\nimport { RecursiveShortcodeProps } from './Shortcode';\n\nexport default pureEnhance(\n 'Bold',\n)(({ elements, RecursiveShortcode, ...rest }) => (\n \n \n \n));","import React from 'react';\nimport { withProps } from '@team-griffin/rehook';\nimport TextButton, {\n Size as TextButtonSize,\n} from '@ux/text-button';\nimport { connect } from '@ux/fabric';\nimport { selectors as wlSelectors } from '@ux/whitelabel';\nimport pureEnhance from '@ux/pure-enhance';\nimport * as r from 'ramda';\nimport { RecursiveShortcodeProps } from './Shortcode';\n\nconst getUsfConfig = wlSelectors.getAppConfig('usf');\n\nconst mapStateToProps = r.pipe(\n getUsfConfig,\n r.pathOr([], [ 'externalRoutes' ]),\n r.objOf('externalRoutes'),\n);\n\nexport default pureEnhance(\n 'Link', [\n //@ts-ignore (apparently incompatible states)\n withProps(connect(mapStateToProps)),\n ])(({\n RecursiveShortcode,\n elements,\n contentType,\n attributes,\n theme,\n against,\n externalRoutes,\n ...rest\n}) => (\n \n \n \n));\n","import React, { Fragment } from 'react';\nimport { isFalse } from '@team-griffin/capra';\nimport * as r from 'ramda';\nimport pureEnhance from '@ux/pure-enhance';\n\nconst escapeShortCodes = r.pipe(\n r.replace('[!', '['),\n r.replace('!/]', '/]'),\n r.replace('[/!', '[/'),\n);\n\nconst nl2br = (string: string) => string.split('\\n')\n .map(r.identity)\n //@ts-ignore typescript cant figure typing out\n // eslint-disable-next-line react/no-array-index-key\n .reduce((prev, cur, i) => [ prev, (
), cur ]);\n\nconst formatText = (text: string, newline: boolean|Element) => r.pipe(\n escapeShortCodes,\n // unless newline is false, run through nl2br\n r.unless(\n r.always(isFalse(newline)),\n nl2br,\n ),\n)(text);\n\ninterface Props {\n text: string,\n nl2br: Element,\n}\nexport default pureEnhance(\n 'Text',\n)(({ text, nl2br }) => (\n \n {formatText(text, nl2br)}\n \n));\n","import React, { lazy, Suspense } from 'react';\nimport { withProps } from '@team-griffin/rehook';\nimport TextButton, { Size as TextButtonSize } from '@ux/text-button';\nimport { withBreakpointsHook } from '@ux/responsive';\nimport { gu2px } from '@ux/theme-utils';\nimport pureEnhance from '@ux/pure-enhance';\nimport { RecursiveShortcodeProps } from './Shortcode';\n\n/*\n React-Tooltip is a heavy dependency therefore we asynchronously load it in\n and gracefully decorate the functionality in once it has loaded\n*/\nconst ReactTooltip = lazy(() => import(\n /* webpackChunkName: \"react-tooltip-lite\" */\n 'react-tooltip-lite'\n));\n\nexport default pureEnhance(\n 'TooltipShortcode', [\n withBreakpointsHook,\n withProps(({\n theme,\n isMinLg,\n }: RecursiveShortcodeProps) => {\n return {\n eventToggle: isMinLg ? void 0 : 'onClick',\n padding: `${gu2px(2, theme.spacing)}px`, // requires String; gross\n };\n }),\n ],\n)(({\n RecursiveShortcode,\n theme,\n against,\n padding,\n eventToggle,\n attributes,\n elements,\n}) => {\n const CallToAction = (\n \n {attributes.label}\n \n );\n\n return (\n \n {/*@ts-ignore children doesnt exist */}\n \n \n \n )}\n >\n {CallToAction}\n \n \n );\n});\n","import React, { Fragment, Suspense, lazy, ReactNode } from 'react';\nimport pureEnhance from '@ux/pure-enhance';\nimport PendingShortcode from './PendingShortcode';\nimport { getAgainst } from 'presentation/utils/colorway';\nimport { nuller } from '@team-griffin/capra';\nimport { Theme } from '@ux/theme-utils';\nimport { Layout } from 'domain/constants/layout';\nimport { Styles } from './stylesheets';\nimport { BreakpointProps } from '@ux/responsive';\nimport { ShortcodeProps } from '.';\nimport * as r from 'ramda';\nimport { Against } from '@ux/button';\n\n/*\n These shortcodes should not be lazy loaded in as they are already in the\n main bundle and it causes a unnecessary shimmer which makes the page feel\n less responsive\n*/\nimport Alt from './Alt';\nimport Bold from './Bold';\nimport Italic from './Italic';\nimport Link from './Link';\nimport Text from './Text';\nimport Tooltip from './Tooltip';\n\nconst Glyph = lazy(() => import(\n /* webpackChunkName: \"shortcode-glyph\" */\n './Glyph'\n));\n\nconst Sup = lazy(() => import(\n /* webpackChunkName: \"shortcode-sup\" */\n './Sup'\n));\n\nconst List = lazy(() => import(\n /* webpackChunkName: \"shortcode-list\" */\n './List'\n));\n\nconst OrderedList = lazy(() => import(\n /* webpackChunkName: \"shortcode-ordered-list\" */\n './OrderedList'\n));\n\nconst ListItem = lazy(() => import(\n /* webpackChunkName: \"shortcode-list-item\" */\n './ListItem'\n));\n\nconst TickListItem = lazy(() => import(\n /* webpackChunkName: \"shortcode-tick-list-item\" */\n './TickListItem'\n));\n\nconst ProductPrice = lazy(() => import(\n /* webpackChunkName: \"shortcode-product-price\" */\n './ProductPrice'\n));\n\nconst PhoneNumber = lazy(() => import(\n /* webpackChunkName: \"shortcode-phone-number\" */\n './PhoneNumber'\n));\n\ndeclare const i: number;\ndeclare const element: ShortcodeProps;\n\nexport interface RecursiveShortcodeProps extends BreakpointProps{\n elements: ShortcodeProps[],\n layout?: Layout,\n RecursiveShortcode: React.LazyExoticComponent,\n theme?: Theme,\n against?: Against,\n styles?: Styles,\n attributes?: {\n use?: string,\n number?: number,\n analyticskey?: string,\n goto?: string,\n label?: ReactNode,\n prices?: string,\n inctax?: string,\n }\n nl2br?: boolean,\n rest: {\n [key: string]: any,\n }\n [key: string]: any,\n}\nconst RecursiveShortcode = ({ elements, ...rest }: RecursiveShortcodeProps) => (\n \n \n \n \n \n);\n\nexport interface ShortcodeOuterProps {\n theme?: Theme,\n against?: Against,\n RecursiveShortcode: React.LazyExoticComponent,\n code: RecursiveShortcodeProps,\n}\n\nfunction genericShortcodeHandler(\n shortcodeName: string,\n Component: React.LazyExoticComponent | React.ComponentType,\n) {\n return [\n r.both(\n r.propEq('type', 'element'),\n r.propEq('name', shortcodeName),\n ),\n (props: ShortcodeOuterProps) => (\n \n ),\n ];\n}\n\nconst Shortcode = ({ code, ...rest }: ShortcodeOuterProps) => {\n const props = r.pipe(\n r.ifElse(\n () => r.is(String, code),\n r.assoc('code', code),\n r.mergeDeepLeft(code),\n ),\n r.over(\n r.lensProp('against'),\n (colorway) => getAgainst(colorway),\n ),\n r.assoc('RecursiveShortcode', RecursiveShortcode),\n r.over(\n r.lensProp('attributes'),\n r.defaultTo({}),\n ),\n )(rest);\n\n // @ts-ignore\n const Element = r.cond([\n [\n r.isNil,\n nuller,\n ],\n [\n r.propIs(String, 'code'),\n () => (\n //@ts-ignore\n \n ),\n ],\n [\n r.propEq('type', 'text'),\n () => (\n \n ),\n ],\n genericShortcodeHandler('i', Italic),\n genericShortcodeHandler('b', Bold),\n genericShortcodeHandler('alt', Alt),\n genericShortcodeHandler('sup', Sup),\n genericShortcodeHandler('glyph', Glyph),\n genericShortcodeHandler('tel', PhoneNumber),\n genericShortcodeHandler('link', Link),\n genericShortcodeHandler('productprice', ProductPrice),\n genericShortcodeHandler('tooltip', Tooltip),\n [\n r.both(\n r.propEq('type', 'element'),\n r.propEq('name', 'list'),\n ),\n () => r.ifElse(\n r.propEq('style', 'number'),\n () => (\n \n ),\n () => (\n \n ),\n )(props.attributes),\n ],\n [\n r.both(\n r.propEq('type', 'element'),\n r.propEq('name', 'li'),\n ),\n () => r.ifElse(\n r.propEq('style', 'glyph'),\n () => (\n \n ),\n () => (\n \n ),\n )(props.attributes),\n ],\n //@ts-ignore\n genericShortcodeHandler('root', RecursiveShortcode),\n [\n r.T,\n nuller,\n ],\n ]);\n\n return (\n \n );\n};\n\nconst ShortcodeWrapper = (props: ShortcodeOuterProps) => (\n \n )}\n >\n \n \n);\n\nconst enhance = pureEnhance('Shortcode');\n\nexport default enhance(ShortcodeWrapper);\n","import Shortcode, { RecursiveShortcodeProps } from './Shortcode';\n\n//TODO: help.. please.\nexport type ShortcodeProps = RecursiveShortcodeProps;\n\n\nexport default Shortcode;\n","import React from 'react';\nimport * as r from 'ramda';\n\nexport default (BaseComponent: any) => r.ifElse(\n r.prop('visible'),\n (props) => ,\n (props) => (\n
\n \n
\n ),\n);\n","export default (url: string, language: string) => {\n if (url && url.length && language) {\n let parsedLanguage;\n if (language.split('-').length === 2) {\n parsedLanguage = [\n language.split('-')[0],\n language.split('-')[1].toUpperCase(),\n ].join('-');\n } else {\n parsedLanguage = language;\n }\n return url.replace('{{language}}', parsedLanguage);\n }\n return url;\n};","/*\n createImageAlt({\n illustration: ?String,\n imageUrl: String,\n });\n\n Returns a relevant alt tag text from the URL path\n*/\n\nimport { isNotNilOrEmpty } from '@team-griffin/capra';\nimport * as r from 'ramda';\n\nconst hasImage = r.propSatisfies(isNotNilOrEmpty, 'imageUrl');\n\n/*\n getImageName\n From a URL like https://img1.wsimg.com/cdn/Image/All/Website/2/en-GB/ad586f1e-81a0-4a9d-a675-e266e25e965f/Christian_Jaroljmek.jpg\n return the text between the final slash and dot (Christian_Jaroljmek)\n\n If no regex match, return the string as is (this will capture illustrations)\n*/\nconst getImageName = (str: string) => {\n if (typeof str !== 'string') {\n return '';\n }\n\n const image = str.match(/\\/([^/]+?)\\.[a-zA-Z0-9]+$/);\n\n if (image && image[1]) {\n return image[1];\n }\n\n return str;\n};\n\n/*\n formatName\n Replace any underscores and hyphens with whitespace\n*/\nconst formatName = (str: string) => str.replace(/[-_]/g, ' ');\n\n// eslint-disable-next-line no-underscore-dangle\nexport const __test__ = {\n getImageName,\n formatName,\n};\n\nexport default r.ifElse(\n hasImage,\n r.pipe(\n r.prop('imageUrl'),\n getImageName,\n formatName,\n ),\n r.always(''),\n);","import React from 'react';\nimport {\n defaultProps,\n} from '@team-griffin/rehook';\nimport Button, {\n Against,\n Status,\n Size,\n} from '@ux/reactive-button';\nimport callToAction from 'presentation/hocs/callToAction';\nimport * as r from 'ramda';\nimport pureEnhance from '@ux/pure-enhance';\nimport { Theme } from '@ux/theme-utils';\nimport { CTA } from 'core/ribbons/cta';\nimport { Product } from '@ux/product';\n\ninterface OuterProps extends CTA {\n product?: Product,\n theme: Theme,\n against?: Against,\n block?: boolean,\n size?: Size,\n ribbonId: string,\n index: number,\n glyph?: string,\n}\ninterface DefaultProps extends OuterProps {\n against: Against,\n}\ninterface InnerProps extends DefaultProps {\n addingStatus: Status,\n handleClick: (props: any) => () => void,\n}\n\nconst PureCallToAction = ({\n kind,\n against,\n label,\n addingStatus,\n handleClick,\n ...props\n}: InnerProps) => {\n const status = r.cond([\n [ r.equals('REQUESTED'), r.always(Status.PENDING) ],\n [ r.equals('SUCCESS'), r.always(Status.SUCCESS) ],\n [ r.equals('FAILED'), r.always(Status.FAILURE) ],\n [ r.T, r.always(Status.DEFAULT) ],\n ])(addingStatus);\n\n const goto = r.pathOr(null, [ 'behavior', 'goto' ], props);\n\n const buttonProps = r.omit([\n 'colorway',\n 'actions',\n 'buttonId',\n 'ribbonId',\n 'index',\n 'behavior',\n 'handlePlayVideoClick',\n 'handleSetVisibilityClick',\n 'handleConfigureClick',\n 'handleApplyVoucherClick',\n 'handleAddToBasketClick',\n 'handleNavigateClick',\n 'handleAnalytics',\n 'ribbonList',\n ], props);\n\n return (\n \n {label}\n \n );\n};\n\nexport const enhance = pureEnhance(\n 'CallToAction',\n {\n hocs: [\n callToAction,\n ],\n hooks: [\n defaultProps({\n against: Against.LIGHT,\n }),\n ],\n },\n);\n\nexport default enhance(PureCallToAction);\n","export enum Behavior {\n NAVIGATION = 'navigation',\n ADD_TO_BASKET = 'addToBasket',\n APPLY_VOUCHER = 'APPLY_VOUCHER',\n CONFIGURE = 'configure',\n SET_VISIBILITY = 'changeActiveVisibilitySet',\n PLAY_VIDEO = 'playVideo',\n}\n\nexport default null;\n","import {\n compose,\n defaultProps,\n withProps,\n withHandlers,\n} from 'recompose';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { useWindow } from '@ux/hooks';\nimport { addToBasket, applyVoucher } from 'application/signals/basket';\nimport { setVisibility } from 'application/signals/ribbons';\nimport {\n productClicked,\n promotionClicked,\n productAddToBasket,\n} from 'application/signals/cta';\nimport { getAddingStatus } from 'domain/selectors/basket';\nimport { getExternalRoutes } from 'domain/selectors/common';\nimport { createRibbonName } from 'domain/transformers/ribbons';\nimport { getRibbon } from 'domain/selectors/ribbons';\nimport { Behavior } from 'domain/constants/callToAction';\nimport { signals } from '@team-griffin/redux-modal-router';\nimport { selectors } from '@ux/product';\n\nconst formatPricingTier = (tier) => {\n if (tier == null) {\n return;\n }\n if (tier.paymentInterval == null || tier.term == null) {\n return;\n }\n return `${tier.paymentInterval}:${tier.term}`;\n};\n\nconst mapStateToProps = (state, props) => {\n const buttonId = `${props.ribbonId}-cta-${props.index}`;\n const externalRoutes = getExternalRoutes(state);\n const ribbon = getRibbon(props.ribbonId)(state);\n const ribbonType = ribbon?.type;\n const ribbonName = ribbon?.props?.name;\n const product = props?.product;\n\n const ribbonList = createRibbonName(ribbonType, ribbonName);\n return {\n externalRoutes,\n addingStatus: getAddingStatus(buttonId)(state),\n buttonId,\n ribbonList,\n product,\n };\n};\n\nconst mapDispatchToProps = (dispatch) => bindActionCreators({\n addToBasket,\n applyVoucher,\n setVisibility,\n openReduxModal: signals.open,\n productClicked,\n promotionClicked,\n productAddToBasket,\n}, dispatch);\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n return {\n ...stateProps,\n ...ownProps,\n actions: {\n ...dispatchProps,\n ...ownProps.actions,\n },\n };\n};\n\nexport default compose(\n defaultProps({\n behavior: {},\n }),\n connect(\n mapStateToProps,\n mapDispatchToProps,\n mergeProps,\n ),\n withProps(() => ({\n window: useWindow(),\n })),\n withHandlers({\n handleAnalytics: (props) => () => {\n const ctaType = props?.behavior?.type;\n const type = props?.behavior?.analytics?.type;\n const list = props.ribbonList;\n const product = props.product;\n\n if (type === 'PRODUCT') {\n const productId = props?.behavior?.analytics?.productId;\n props.actions.productClicked({\n productId,\n list,\n });\n } else if (type === 'PROMOTION') {\n const promotion = props?.behavior?.analytics?.promotion;\n props.actions.promotionClicked({ promotion });\n } else if (ctaType === 'addToBasket') {\n props.actions.productAddToBasket({\n list,\n product,\n });\n }\n },\n }),\n withHandlers({\n handleAddToBasketClick: (props) => () => {\n const {\n buttonId,\n product,\n actions: {\n addToBasket,\n },\n behavior: {\n productId,\n postAction,\n pricingTier,\n },\n handleAnalytics,\n } = props;\n const productData = {\n skuId: product ? product.defaultSkuId : null,\n name: product ? product.name : null,\n price: product ? selectors.getPrice({ product, includeTax: false }) : null,\n category: product ? product.categoryName : null,\n };\n addToBasket(\n buttonId,\n productId,\n postAction,\n formatPricingTier(pricingTier),\n 1, //quantity\n productData,\n );\n\n handleAnalytics();\n },\n handleNavigateClick: ({ handleAnalytics }) => () => {\n handleAnalytics();\n },\n handleApplyVoucherClick: ({\n buttonId,\n actions: {\n applyVoucher,\n },\n behavior: {\n voucherCode,\n postAction,\n },\n }) => () => {\n applyVoucher(buttonId, voucherCode, postAction);\n },\n handleConfigureClick: ({\n window,\n behavior: {\n productId,\n pricingTier,\n },\n }) => {\n return () => {\n const tier = formatPricingTier(pricingTier);\n const query = new URLSearchParams();\n query.append('productId', productId);\n if (tier) {\n query.append('pricingTier', tier);\n }\n const q = query.toString();\n window.location.href = `/configure?${q}`;\n };\n },\n handleSetVisibilityClick: ({\n actions: {\n setVisibility,\n },\n behavior,\n }) => () => {\n setVisibility(behavior.visibilitySet);\n },\n handlePlayVideoClick: ({\n actions: {\n openReduxModal,\n },\n behavior: {\n videoId,\n provider,\n },\n }) => () => {\n openReduxModal({\n route: 'PLAY_VIDEO',\n params: {\n videoId,\n provider,\n },\n });\n },\n }),\n withProps((ownerProps) => ({\n handleClick: (() => {\n switch (ownerProps.behavior?.type) {\n case Behavior.ADD_TO_BASKET: \n return ownerProps.handleAddToBasketClick;\n case Behavior.APPLY_VOUCHER:\n return ownerProps.handleApplyVoucherClick;\n case Behavior.CONFIGURE:\n return ownerProps.handleConfigureClick;\n case Behavior.PLAY_VIDEO:\n return ownerProps.handlePlayVideoClick;\n case Behavior.SET_VISIBILITY:\n return ownerProps.handleSetVisibilityClick;\n case Behavior.NAVIGATION:\n return ownerProps.handleNavigateClick;\n default:\n return () => null;\n }\n })(),\n // add an analytics prefixed `id` to the cta if required\n id: (() => {\n const behavior = ownerProps.behavior;\n const id = ownerProps.id;\n if(behavior?.analytics?.linkAttribution) {\n return `usf-cta-${behavior.analytics.linkAttribution}`\n } else {\n return id;\n }\n })(),\n })),\n);","export enum ImageAspectRatio {\n W16H9 = '16:9',\n W4H3 = '4:3',\n W1H1 = '1:1',\n W32H9 = '32:9',\n W64H9 = '64:9',\n W3H4 = '3:4',\n W9H16 = '9:16',\n W9H32 = '9:32',\n}\n","import { ImageAspectRatio } from 'domain/constants/imageAspectRatio';\n\nexport const imageAspectRatioPercentage = (ratio: ImageAspectRatio) => {\n const map: {[key in ImageAspectRatio]:number} = {\n [ImageAspectRatio.W16H9]: 56.25,\n [ImageAspectRatio.W4H3]: 75,\n [ImageAspectRatio.W1H1]: 100,\n [ImageAspectRatio.W32H9]: 28.125,\n [ImageAspectRatio.W64H9]: 14.0625,\n [ImageAspectRatio.W3H4]: 133.3333,\n [ImageAspectRatio.W9H16]: 177.7778,\n [ImageAspectRatio.W9H32]: 355.5556,\n };\n return `${map[ratio] || 56.25}%`;\n};\n","\n// /*\n// createImageUrl(\n// {\n// illustration: ?String,\n// imageUrl: ?String,\n// },\n// theme,\n// currentLanguage,\n// );\n\n// Returns a painbtrush URL if an illustration is provided,\n// otherwise returns a static imageUrl\n// */\n\nimport { createPaintbrushUrl } from '@ux/illustrations';\nimport { isNotNilOrEmpty } from '@team-griffin/capra';\nimport * as r from 'ramda';\nimport urlLanguageParse from 'presentation/utils/urlLanguageParse';\nimport { Theme } from '@ux/theme-utils';\n\nconst hasIllustration = r.propSatisfies(isNotNilOrEmpty, 'illustration');\n\nexport default (\n media: {\n illustration: string,\n imageUrl: string\n },\n theme: Theme,\n currentLanguage?: string,\n) => r.ifElse(\n hasIllustration,\n () => createPaintbrushUrl(media.illustration, theme),\n () => urlLanguageParse(media.imageUrl, currentLanguage),\n)(media);"],"sourceRoot":""}