\n );\n};\n\nPureWash.displayName = 'Wash';\n\nexport default PureWash;\n","import React, { ComponentClass } from 'react';\nimport { useBreakpoints } from '@ux/responsive';\nimport useStylesheet from './Background.stylesheet';\nimport Layer, { Layer as ImageLayer } from 'presentation/components/common/Layer';\nimport Wash from './Wash';\nimport withLanguage from 'presentation/hocs/withLanguage';\nimport urlLanguageParse from 'presentation/utils/urlLanguageParse';\nimport findResponsiveItem from 'presentation/utils/findResponsiveItem';\nimport { Layout } from 'domain/constants/layout';\nimport { Colorway } from 'domain/constants/colorway';\nimport { ResponsiveSet } from 'core/ribbons/primitives';\n\nexport interface Background {\n fallback: {\n url: string,\n },\n mp4?: string,\n webm?: string,\n loop?: boolean,\n}\nexport type BackgroundArray = ResponsiveSet
;\n\ninterface OuterProps {\n layout: Layout,\n background: BackgroundArray,\n duoLayout?: boolean,\n hasTiles?: boolean,\n colorway: Colorway,\n hideGradient?: boolean,\n}\ninterface InnerProps extends OuterProps {\n currentLanguage: string,\n}\n\ndeclare const layer: ImageLayer;\ndeclare const i: number;\n\nconst showFallbackImage = (video: HTMLVideoElement) => {\n video.autoplay = false;\n video.load();\n};\n\nexport const PureBackground = ({\n layout,\n duoLayout,\n hasTiles,\n colorway,\n currentLanguage,\n background,\n hideGradient = false,\n}: InnerProps) => {\n const { styles } = useStylesheet();\n const activeBackground = findResponsiveItem(\n useBreakpoints(),\n background,\n );\n const backgroundType = Array.isArray(activeBackground) ? 'image' : 'video';\n return (\n \n \n \n
\n
\n \n \n \n \n \n \n {!hideGradient && (\n \n )}\n \n );\n};\n\nPureBackground.displayName = 'Background';\n\nexport default withLanguage(PureBackground) as ComponentClass;\n","import { useStyles } from '@team-griffin/stylr';\n\nexport default () => {\n return useStyles({\n default: {\n videoWrapper: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: 'hidden',\n },\n video: {\n objectFit: 'cover',\n objectPosition: 'center center',\n width: '100%',\n height: '100%',\n },\n fallbackVideoImage: {\n minHeight: '100%',\n minWidth: '100%',\n position: 'absolute',\n top: 0,\n },\n },\n }, []);\n};\n","import { default as BackgroundComponent, Background, BackgroundArray } from './Background';\n\nexport {\n Background,\n BackgroundArray,\n};\n\nexport default BackgroundComponent;\n","import * as r from 'ramda';\nimport { withProps } from '@team-griffin/rehook';\nimport { isInternalUrl, isHashUrl } from 'domain/url';\nimport { NavLink } from 'react-router-dom';\n\ninterface AnyProps {\n url?: string,\n action?: {\n url?: string,\n [key: string]: any,\n }\n [key: string]: any,\n}\n\nexport type UrlComponentType = typeof NavLink | 'a' | 'div';\nconst withUrlComponent = withProps((props: AnyProps) => r.pipe(\n r.either(\n r.prop('url'),\n r.path([ 'action', 'url' ]),\n ),\n r.cond([\n [\n r.isNil,\n () => ({\n Component: 'div',\n }),\n ],\n [\n isInternalUrl,\n (url) => ({\n Component: NavLink,\n to: url,\n }),\n ],\n [\n isHashUrl,\n (url) => ({\n Component: NavLink,\n to: url,\n }),\n ],\n [\n r.T,\n (url) => ({\n Component: 'a',\n href: url,\n }),\n ],\n ]),\n//@ts-ignore\n)(props));\n\nexport default withUrlComponent;","function createError(message) {\n var err = new Error(message);\n err.source = \"ulid\";\n return err;\n}\n// These values should NEVER change. If\n// they do, we're no longer making ulids!\nvar ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"; // Crockford's Base32\nvar ENCODING_LEN = ENCODING.length;\nvar TIME_MAX = Math.pow(2, 48) - 1;\nvar TIME_LEN = 10;\nvar RANDOM_LEN = 16;\nfunction replaceCharAt(str, index, char) {\n if (index > str.length - 1) {\n return str;\n }\n return str.substr(0, index) + char + str.substr(index + 1);\n}\nfunction incrementBase32(str) {\n var done = undefined;\n var index = str.length;\n var char = void 0;\n var charIndex = void 0;\n var maxCharIndex = ENCODING_LEN - 1;\n while (!done && index-- >= 0) {\n char = str[index];\n charIndex = ENCODING.indexOf(char);\n if (charIndex === -1) {\n throw createError(\"incorrectly encoded string\");\n }\n if (charIndex === maxCharIndex) {\n str = replaceCharAt(str, index, ENCODING[0]);\n continue;\n }\n done = replaceCharAt(str, index, ENCODING[charIndex + 1]);\n }\n if (typeof done === \"string\") {\n return done;\n }\n throw createError(\"cannot increment this string\");\n}\nfunction randomChar(prng) {\n var rand = Math.floor(prng() * ENCODING_LEN);\n if (rand === ENCODING_LEN) {\n rand = ENCODING_LEN - 1;\n }\n return ENCODING.charAt(rand);\n}\nfunction encodeTime(now, len) {\n if (isNaN(now)) {\n throw new Error(now + \" must be a number\");\n }\n if (now > TIME_MAX) {\n throw createError(\"cannot encode time greater than \" + TIME_MAX);\n }\n if (now < 0) {\n throw createError(\"time must be positive\");\n }\n if (Number.isInteger(now) === false) {\n throw createError(\"time must be an integer\");\n }\n var mod = void 0;\n var str = \"\";\n for (; len > 0; len--) {\n mod = now % ENCODING_LEN;\n str = ENCODING.charAt(mod) + str;\n now = (now - mod) / ENCODING_LEN;\n }\n return str;\n}\nfunction encodeRandom(len, prng) {\n var str = \"\";\n for (; len > 0; len--) {\n str = randomChar(prng) + str;\n }\n return str;\n}\nfunction decodeTime(id) {\n if (id.length !== TIME_LEN + RANDOM_LEN) {\n throw createError(\"malformed ulid\");\n }\n var time = id.substr(0, TIME_LEN).split(\"\").reverse().reduce(function (carry, char, index) {\n var encodingIndex = ENCODING.indexOf(char);\n if (encodingIndex === -1) {\n throw createError(\"invalid character found: \" + char);\n }\n return carry += encodingIndex * Math.pow(ENCODING_LEN, index);\n }, 0);\n if (time > TIME_MAX) {\n throw createError(\"malformed ulid, timestamp too large\");\n }\n return time;\n}\nfunction detectPrng() {\n var allowInsecure = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var root = arguments[1];\n\n if (!root) {\n root = typeof window !== \"undefined\" ? window : null;\n }\n var browserCrypto = root && (root.crypto || root.msCrypto);\n if (browserCrypto) {\n return function () {\n var buffer = new Uint8Array(1);\n browserCrypto.getRandomValues(buffer);\n return buffer[0] / 0xff;\n };\n } else {\n try {\n var nodeCrypto = require(\"crypto\");\n return function () {\n return nodeCrypto.randomBytes(1).readUInt8() / 0xff;\n };\n } catch (e) {}\n }\n if (allowInsecure) {\n try {\n console.error(\"secure crypto unusable, falling back to insecure Math.random()!\");\n } catch (e) {}\n return function () {\n return Math.random();\n };\n }\n throw createError(\"secure crypto unusable, insecure Math.random not allowed\");\n}\nfunction factory(currPrng) {\n if (!currPrng) {\n currPrng = detectPrng();\n }\n return function ulid(seedTime) {\n if (isNaN(seedTime)) {\n seedTime = Date.now();\n }\n return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, currPrng);\n };\n}\nfunction monotonicFactory(currPrng) {\n if (!currPrng) {\n currPrng = detectPrng();\n }\n var lastTime = 0;\n var lastRandom = void 0;\n return function ulid(seedTime) {\n if (isNaN(seedTime)) {\n seedTime = Date.now();\n }\n if (seedTime <= lastTime) {\n var incrementedRandom = lastRandom = incrementBase32(lastRandom);\n return encodeTime(lastTime, TIME_LEN) + incrementedRandom;\n }\n lastTime = seedTime;\n var newRandom = lastRandom = encodeRandom(RANDOM_LEN, currPrng);\n return encodeTime(seedTime, TIME_LEN) + newRandom;\n };\n}\nvar ulid = factory();\n\nexport { replaceCharAt, incrementBase32, randomChar, encodeTime, encodeRandom, decodeTime, detectPrng, factory, monotonicFactory, ulid };\n","import { useStyles } from '@team-griffin/stylr';\nimport longhand from '@team-griffin/css-longhand';\nimport { gu2px, Theme, useTheme } from '@ux/theme-utils';\nimport urlLanguageParse from 'presentation/utils/urlLanguageParse';\nimport { CornerEmbellishmentsType } from './CornerEmbellishments';\nimport { useBreakpoints } from '@ux/responsive';\n\nconst cornerToPosition = (str: string) => {\n switch (str) {\n case 'topLeft': return '0 0';\n case 'topRight': return 'right 0';\n case 'bottomLeft': return '0 bottom';\n case 'bottomRight': return 'right bottom';\n default: return '';\n }\n};\n\nconst gu2CornerSize = (gu: number, spacing?: number) => `${gu2px(gu, spacing)}px ${gu2px(gu, spacing)}px`;\n\nconst cornerSize = ({\n theme,\n isMinSm,\n isMinMd,\n}: {\n theme: Theme,\n isMinSm: boolean,\n isMinMd: boolean,\n}) => {\n const {\n spacing,\n } = theme;\n if (isMinMd) {\n return gu2CornerSize(6, spacing);\n }\n if (isMinSm) {\n return gu2CornerSize(5, spacing);\n }\n return gu2CornerSize(4, spacing);\n};\n\nconst generateCornerImages = ({\n cornerEmbellishments,\n currentLanguage,\n theme,\n isMinSm,\n isMinMd,\n}: {\n cornerEmbellishments: CornerEmbellishmentsType,\n currentLanguage: string,\n theme: Theme,\n isMinSm: boolean,\n isMinMd: boolean,\n}) => {\n const embellishments = cornerEmbellishments ?? {};\n const size = cornerSize({\n theme,\n isMinSm,\n isMinMd,\n });\n const filteredEmbellishments = [] as {\n image: string,\n size: string,\n position: string,\n repeat: string,\n }[];\n Object.keys(embellishments).forEach((\n corner: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight',\n ) => {\n if (embellishments[corner] !== null) {\n filteredEmbellishments.push({\n image: `url(${urlLanguageParse(embellishments[corner], currentLanguage)})`,\n size,\n position: cornerToPosition(corner),\n repeat: 'no-repeat',\n });\n }\n });\n return filteredEmbellishments;\n};\n\nconst cornerArrayToCssProperty = (\n prop: 'image' | 'size' | 'position' | 'repeat',\n cornerImages: {\n image: string,\n size: string,\n position: string,\n repeat: string,\n }[],\n) => {\n const joinedPropArray: string[] = [];\n cornerImages.forEach((image) => {\n joinedPropArray.push(image[prop]);\n });\n return joinedPropArray.join(',');\n};\n\nexport default ({\n currentLanguage,\n cornerEmbellishments,\n}: {\n currentLanguage: string,\n cornerEmbellishments: CornerEmbellishmentsType,\n}) => {\n const breakpoints = useBreakpoints();\n const {\n theme,\n } = useTheme();\n const cornerImages = generateCornerImages({\n currentLanguage,\n cornerEmbellishments,\n ...breakpoints,\n theme,\n });\n return useStyles({\n default: {\n root: {\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n ...longhand('background', {\n size: cornerArrayToCssProperty('size', cornerImages),\n image: cornerArrayToCssProperty('image', cornerImages),\n position: cornerArrayToCssProperty('position', cornerImages),\n repeat: cornerArrayToCssProperty('repeat', cornerImages),\n }),\n },\n },\n }, []);\n};","import React, { ComponentClass } from 'react';\nimport withLanguage from 'presentation/hocs/withLanguage';\nimport useStylesheet from './CornerEmbellishments.stylesheet';\n\nexport type CornerEmbellishmentsType = {\n topRight?: string,\n bottomRight?: string,\n bottomLeft?: string,\n topLeft?: string\n};\ninterface OuterProps {\n cornerEmbellishments?: CornerEmbellishmentsType,\n}\n\nexport interface InnerProps extends OuterProps {\n currentLanguage: string,\n}\nconst PureCornerEmbellishments = ({\n currentLanguage,\n cornerEmbellishments,\n}: InnerProps) => {\n const {\n styles,\n } = useStylesheet({\n currentLanguage,\n cornerEmbellishments,\n });\n return (\n \n );\n};\n\nPureCornerEmbellishments.displayName = 'CornerEmbellishments';\n\nexport default withLanguage(PureCornerEmbellishments) as ComponentClass
;","import React, { Fragment, ReactNode } from 'react';\nimport { PreHeading01, Heading01, SubHeading01 } from '@ux/typography';\nimport PaddingBox, { Side } from '@ux/padding-box';\nimport CallToAction from 'components/common/CallToAction';\nimport { Size as ButtonSize } from '@ux/button';\nimport Shortcode, { ShortcodeProps } from 'components/Shortcode';\nimport { getAgainst } from 'presentation/utils/colorway';\nimport { useBreakpoints } from '@ux/responsive';\nimport useStylesheet from './Body.stylesheet';\nimport { useTheme } from '@ux/theme-utils';\nimport { Layout } from 'domain/constants/layout';\nimport { Colorway } from 'domain/constants/colorway';\nimport { CTA } from 'core/ribbons/cta';\nimport { isNilOrEmpty } from 'presentation/utils/generalUtils';\n\nexport interface OuterProps {\n hBaseline?: number,\n text: {\n precursor?: ShortcodeProps,\n title?: ShortcodeProps,\n body?: ShortcodeProps,\n },\n additionalText?: string|ReactNode,\n footerText?: string|ReactNode,\n ctas: CTA[],\n colorway: Colorway,\n layout: Layout,\n ribbonId: string,\n}\n\ndeclare const cta: CTA;\ndeclare const i: number;\n\nconst PureBody = ({\n hBaseline = 1,\n text,\n additionalText,\n footerText,\n ctas,\n colorway,\n layout,\n ribbonId,\n}: OuterProps) => {\n const {\n isMinSm,\n } = useBreakpoints();\n const {\n theme,\n } = useTheme();\n const {\n body,\n precursor,\n title,\n } = text;\n const hasBodyText = !isNilOrEmpty(body);\n const hasCta = !isNilOrEmpty(ctas);\n const hasPrecursor = !isNilOrEmpty(precursor);\n const hasTitle = !isNilOrEmpty(title);\n const hasFooterText = !isNilOrEmpty(footerText);\n const {\n styles,\n } = useStylesheet({\n isMinSm,\n theme,\n layout,\n colorway,\n });\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {additionalText}\n \n \n \n \n \n \n \n
\n \n \n \n \n {footerText}\n \n \n \n );\n};\n\nPureBody.displayName = 'BillboardBody';\n\nexport default PureBody;\n","import { useStyles } from '@team-griffin/stylr';\nimport { getTitleColor, getBodyColor } from 'presentation/utils/colorway';\nimport { gu2px, Theme } from '@ux/theme-utils';\nimport cssSides, { Side } from '@team-griffin/css-sides';\nimport { modifier } from '@ux/style-utils';\nimport { Alignment } from 'domain/constants/alignment';\nimport { smallprint } from '@ux/type-size';\nimport { Colorway } from '@ux/bookends/dist/es/constants';\nimport { Layout } from 'domain/constants/layout';\n\nexport default ({\n theme,\n colorway,\n theme: {\n spacing,\n typography,\n },\n layout: {\n alignment,\n },\n isMinSm,\n}: {\n theme: Theme,\n colorway: Colorway,\n layout: Layout,\n isMinSm: Boolean,\n}) => useStyles({\n default: {\n root: {\n position: 'relative',\n },\n precursor: {\n color: getTitleColor(theme, colorway),\n },\n title: {\n color: getTitleColor(theme, colorway),\n },\n subtitle: {\n color: getBodyColor(theme, colorway),\n marginTop: gu2px(2, spacing),\n },\n ctas: {\n display: 'flex',\n flexDirection: 'column',\n marginTop: gu2px(2, spacing),\n overflow: 'hidden',\n },\n cta: {\n marginTop: gu2px(1, spacing),\n },\n footerText: {\n marginTop: gu2px(1, spacing),\n ...smallprint(typography),\n color: getBodyColor(theme, colorway),\n opacity: 0.9,\n },\n },\n\n isMinSm: {\n ctas: {\n flexDirection: 'row',\n ...cssSides('margin', Side.X, 0 - gu2px(0.5, spacing)),\n },\n cta: {\n marginBottom: 0,\n ...cssSides('margin', Side.X, gu2px(0.5, spacing)),\n },\n },\n\n [modifier('alignment', Alignment.CENTER)]: {\n root: {\n textAlign: 'center',\n },\n footerText: {\n textAlign: 'center',\n },\n ctas: {\n justifyContent: 'center',\n },\n },\n}, [\n { isMinSm },\n { alignment },\n]);","import React from 'react';\nimport PaddingBox from '@ux/padding-box';\nimport { Button, Kind } from '@ux/button';\nimport Message from '@ux/message';\nimport { Colorway } from 'domain/constants/colorway';\nimport useStylesheet from './Scroll.stylesheet';\nimport { Layout } from 'domain/constants/layout';\n\ninterface OuterProps {\n colorway: Colorway,\n onScrollClick: (evt: any) => any,\n layout: Layout,\n}\n\nexport const PureBillboardScroll = ({\n onScrollClick,\n layout,\n colorway,\n}: OuterProps) => {\n const {\n styles,\n } = useStylesheet({ layout });\n const scrollAgainst = colorway === Colorway.PRIMARY_GRADIENT ? Colorway.PRIMARY : colorway;\n return (\n \n \n \n );\n};\n\nPureBillboardScroll.displayName = 'BillboardScroll';\n\nexport default PureBillboardScroll;\n","import { useStyles } from '@team-griffin/stylr';\nimport { gu2px, useTheme } from '@ux/theme-utils';\nimport { Alignment } from 'domain/constants/alignment';\nimport { modifier } from '@ux/style-utils';\nimport { Layout } from 'domain/constants/layout';\n\nexport default ({\n layout: {\n alignment,\n },\n}: {\n layout: Layout,\n}) => {\n const {\n theme,\n } = useTheme();\n const {\n spacing,\n } = theme;\n return useStyles({\n default: {\n scroller: {\n paddingTop: gu2px(2, spacing),\n },\n },\n [modifier('alignment', Alignment.CENTER)]: {\n scroller: {\n textAlign: 'center',\n },\n },\n }, [\n { alignment },\n ]);\n};","import { gu2px } from '@ux/theme-utils';\nimport flexAnchors, { AnchorArray } from 'presentation/utils/flexAnchors';\nimport findResponsiveItem from 'presentation/utils/findResponsiveItem';\nimport { Anchor } from 'domain/constants/anchor';\nimport { BreakpointProps } from '@ux/responsive';\n\n/**\n * Two layouts: Tiles and Duo, require separate containers to site\n * next to each other, bleed to the far edge, but still maintain the\n * site width rules of a single container. This function returns half\n * the width of the container size\n */\nexport const halfContainerWidth = (width: number, spacing: number) => {\n const space = gu2px(1, spacing);\n // add the extra gu of spacing between the two items\n const withSpacing = width + space;\n // account for the additional padding at either side\n const divided = withSpacing/2;\n // remove the accounted for spacing\n return divided - space;\n};\n\n\nexport const getActiveAnchor = (anchor: AnchorArray, breakpoints: BreakpointProps) => {\n const getActive = (from: AnchorArray) => findResponsiveItem(\n breakpoints,\n from,\n );\n\n const activeAnchor = getActive(\n flexAnchors([ Anchor.TOP, null, null ], anchor),\n );\n\n return activeAnchor;\n};\n\nexport default null;","import React, { Fragment } from 'react';\nimport { Container, Row, Column, Justify } from '@ux/grid';\nimport Background, { BackgroundArray } from 'components/common/Background';\nimport Body, { OuterProps as BodyProps } from '../Body';\nimport Scroll from '../Scroll';\nimport { Alignment } from 'domain/constants/alignment';\nimport useStylesheet from './Generic.stylesheet';\nimport { useBreakpoints } from '@ux/responsive';\n\ninterface OuterProps extends BodyProps {\n showScroll: boolean,\n background: BackgroundArray,\n onScrollClick: (evt: any) => any,\n hideGradient?: boolean,\n}\n\nexport const PureBillboardGeneric = ({\n layout,\n colorway,\n hBaseline,\n ctas,\n text,\n additionalText,\n footerText,\n onScrollClick,\n showScroll,\n ribbonId,\n background,\n hideGradient,\n}: OuterProps) => {\n const breakpoints = useBreakpoints();\n const {\n styles,\n } = useStylesheet({\n layout,\n ...breakpoints,\n });\n const justify = layout.alignment === Alignment.CENTER ? Justify.CENTER : null;\n return (\n \n \n \n \n \n \n \n \n
\n \n
\n \n \n \n \n \n \n );\n};\n\nPureBillboardGeneric.displayName = 'BillboardGeneric';\n\nexport default PureBillboardGeneric;\n","import { useStyles } from '@team-griffin/stylr';\nimport getBreakpoints from 'presentation/utils/getBreakpoints';\nimport { getActiveAnchor } from '../styles';\nimport { Layout } from 'domain/constants/layout';\nimport { BreakpointProps } from '@ux/responsive';\n\nexport default (props: {\n layout: Layout,\n} & BreakpointProps) => {\n const {\n layout,\n } = props;\n const {\n anchor,\n } = layout;\n const breakpointProps = getBreakpoints(props);\n const activeAnchor = getActiveAnchor(anchor, breakpointProps);\n return useStyles({\n default: {\n content: {\n flex: 1,\n flexBasis: 'auto',\n justifyContent: activeAnchor,\n display: 'flex',\n flexDirection: 'column',\n },\n },\n }, []);\n};\n","import React, { Fragment } from 'react';\nimport { Container } from '@ux/grid';\nimport Background, { BackgroundArray } from 'components/common/Background';\nimport Body, { OuterProps as BodyProps } from '../Body';\nimport Scroll from '../Scroll';\nimport useStylesheet from './Duo.stylesheet';\nimport { Colorway } from 'domain/constants/colorway';\nimport { Layout } from 'domain/constants/layout';\n\ninterface OuterProps extends BodyProps {\n layout: Layout,\n colorway: Colorway,\n hBaseline?: number,\n showScroll: boolean,\n duoLayout: boolean,\n background: BackgroundArray,\n onScrollClick: (evt: any) => any,\n hideGradient?: boolean,\n}\n\nexport const PureBillboardDuo = ({\n layout,\n colorway,\n hBaseline = 1,\n ctas,\n text,\n additionalText,\n footerText,\n onScrollClick,\n showScroll,\n ribbonId,\n background,\n duoLayout,\n hideGradient,\n}: OuterProps) => {\n const {\n styles,\n } = useStylesheet({\n layout,\n duoLayout,\n });\n return (\n \n \n \n \n \n \n \n \n
\n \n \n \n );\n};\n\nPureBillboardDuo.displayName = 'BillboardDuo';\n\nexport default PureBillboardDuo;\n","import { useStyles } from '@team-griffin/stylr';\nimport { getActiveAnchor, halfContainerWidth } from '../styles';\nimport { breakpoints, useBreakpoints } from '@ux/responsive';\nimport cssSides, { Side } from '@team-griffin/css-sides';\nimport { gu2px, useTheme } from '@ux/theme-utils';\nimport { Layout } from 'domain/constants/layout';\n\nexport default (props: {\n layout: Layout,\n duoLayout: boolean,\n}) => {\n const {\n layout,\n duoLayout,\n } = props;\n const breakpointProps = useBreakpoints();\n const {\n isMinSm,\n isMinMd,\n isMinLg,\n isMinXl,\n } = breakpointProps;\n const {\n theme,\n } = useTheme();\n const {\n anchor,\n } = layout;\n\n const startDuoLayout = layout.startDuoLayout || false;\n\n const activeAnchor = getActiveAnchor(anchor, breakpointProps);\n\n return useStyles({\n default: {\n content: {\n flex: 1,\n flexBasis: 'auto',\n justifyContent: activeAnchor,\n display: 'flex',\n flexDirection: 'column',\n },\n duoLayout: {\n ...cssSides('padding', Side.X, gu2px(1, theme.spacing)),\n ...cssSides('margin', Side.X, 'auto'),\n width: '100%',\n maxWidth: '100%',\n },\n },\n\n isMinSm: {\n duoLayout: {\n maxWidth: breakpoints.sm - gu2px(1, theme.spacing),\n },\n },\n\n isDuoLayoutMd: {\n duoLayout: {\n maxWidth: halfContainerWidth(breakpoints.md, theme.spacing),\n marginLeft: 0,\n },\n },\n isDuoLayoutLg: {\n duoLayout: {\n maxWidth: halfContainerWidth(breakpoints.lg, theme.spacing),\n },\n },\n isDuoLayoutXl: {\n duoLayout: {\n maxWidth: halfContainerWidth(breakpoints.xl, theme.spacing),\n },\n },\n startDuoLayout: {\n duoLayout: {\n marginRight: 0,\n marginLeft: 'auto',\n },\n },\n }, [\n { anchor },\n { isMinSm },\n { isDuoLayoutMd: duoLayout && isMinMd },\n { isDuoLayoutLg: duoLayout && isMinLg },\n { isDuoLayoutXl: duoLayout && isMinXl },\n { startDuoLayout },\n ]);\n};\n","export enum Side {\n START = 'START',\n END = 'END',\n}\n\nexport enum Layout {\n DUO = 'DUO',\n TILES = 'TILES',\n}\n\nexport default null;","import React from 'react';\nimport PaddingBox from '@ux/padding-box';\nimport {\n Heading02,\n BodyCopy01,\n} from '@ux/typography';\nimport Shortcode, { ShortcodeProps } from 'components/Shortcode';\nimport useStylesheet from './Tile.stylesheet';\nimport Glyph from '@ux/glyphs';\nimport { gu2px, useTheme } from '@ux/theme-utils';\nimport callToAction from 'presentation/hocs/callToAction';\nimport withUrlComponent from 'presentation/hooks/withUrlComponent';\nimport { withHover } from '@team-griffin/stylr';\nimport { Colorway } from 'domain/constants/colorway';\nimport { Layout } from 'domain/constants/layout';\n\nexport interface TileProps {\n colorway: Colorway,\n type: string,\n text: {\n body?: ShortcodeProps,\n title?: ShortcodeProps,\n },\n action: {\n url: string,\n linkAttribution?: string,\n },\n leftTile: boolean,\n rightTile: boolean,\n hBaseline: number,\n layout: Layout,\n}\ninterface OuterProps extends TileProps {\n hover: boolean,\n}\n\nexport const PureTile = ({\n colorway,\n text,\n hBaseline,\n action,\n ...props\n}: OuterProps) => {\n const {\n title,\n body,\n } = text;\n const { theme } = useTheme();\n const {\n styles,\n } = useStylesheet({\n colorway,\n ...props,\n });\n const { Component } = withUrlComponent({ action });\n return (\n \n \n
\n \n \n \n \n \n \n \n
\n \n \n \n \n
\n \n
\n \n );\n};\n\nPureTile.displayName = 'Tile';\n\nexport default withHover(callToAction(PureTile));\n","import { useStyles } from '@team-griffin/stylr';\nimport { gu2px, useTheme } from '@ux/theme-utils';\nimport { getTitleColor, getBodyColor, getBackgroundColor } from 'presentation/utils/colorway';\nimport { modifier } from '@ux/style-utils';\nimport { Alignment } from 'domain/constants/alignment';\nimport cssSides, { Side } from '@team-griffin/css-sides';\nimport { breakpoints, useBreakpoints } from '@ux/responsive';\nimport { Side as TilesSide } from './constants';\nimport { halfContainerWidth } from './styles';\nimport ribbonPadding from 'presentation/utils/ribbonPadding';\nimport { Colorway } from '@ux/bookends/dist/es/constants';\nimport { Layout } from 'domain/constants/layout';\n\nexport default ({\n colorway,\n hover,\n layout,\n leftTile,\n rightTile,\n}: {\n colorway: Colorway,\n hover: boolean,\n layout: Layout,\n leftTile: boolean,\n rightTile: boolean,\n}) => {\n const {\n theme,\n } = useTheme();\n const {\n isMinSm,\n isMinMd,\n isMinLg,\n isMinXl,\n } = useBreakpoints();\n const {\n alignment,\n tilesSide,\n } = layout;\n\n const {\n spacing,\n } = theme;\n\n return useStyles({\n default: {\n root: {\n flex: 1,\n flexBasis: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: isMinLg ? 'center' : 'flex-start',\n backgroundColor: getBackgroundColor(theme, colorway),\n textAlign: 'left',\n textDecoration: 'none',\n height: '100%',\n ...ribbonPadding({\n spacing,\n isMinSm,\n isMinLg,\n layout: {\n shrinkLeading: isMinLg && rightTile,\n shrinkTrailing: isMinLg && leftTile,\n },\n }),\n },\n container: {\n ...cssSides('padding', Side.X, gu2px(1, spacing)),\n ...cssSides('margin', Side.X, 'auto'),\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n },\n title: {\n color: getTitleColor(theme, colorway),\n paddingRight: gu2px(3, spacing),\n },\n subtitle: {\n color: getBodyColor(theme, colorway),\n marginTop: gu2px(2, spacing),\n },\n box: {\n display: 'flex',\n },\n wrapperText: {\n flex: 1,\n flexBasis: 'auto',\n paddingRight: gu2px(2, spacing),\n },\n wrapperIcon: {\n minWidth: gu2px(3, spacing),\n position: 'relative',\n paddingTop: gu2px(0.5, spacing),\n },\n icon: {\n color: getTitleColor(theme, colorway),\n opacity: 1,\n width: gu2px(3, spacing),\n position: 'absolute',\n right: 0,\n },\n },\n hover: {\n root: {\n textDecoration: 'none',\n },\n icon: {\n opacity: 1,\n marginRight: 0,\n animation: 'arrowAnimation 0.3s',\n animationTimingFunction: 'ease-in-out',\n animationDirection: 'normal',\n animationFillMode: 'forwards',\n },\n },\n\n [modifier('alignment', Alignment.CENTER)]: {\n root: {\n textAlign: 'center',\n },\n },\n\n isMinSm: {\n container: {\n maxWidth: breakpoints.sm - gu2px(1, spacing),\n },\n },\n\n isMinMd: {\n container: {\n // theu're side by side so need an additional 1GU removing\n maxWidth: halfContainerWidth(breakpoints.md, spacing),\n },\n },\n\n isMinLg: {\n container: {\n maxWidth: halfContainerWidth(breakpoints.lg, spacing),\n },\n },\n isMinXl: {\n container: {\n maxWidth: halfContainerWidth(breakpoints.xl, spacing),\n },\n },\n leftTileMedium: {\n container: {\n marginRight: 0,\n },\n },\n rightTileMedium: {\n container: {\n marginLeft: 0,\n },\n },\n leftTileLarge: {\n container: {\n marginRight: 'auto',\n marginLeft: 0,\n },\n },\n\n tilesStartLarge: {\n container: {\n marginLeft: 'auto',\n marginRight: 0,\n },\n },\n }, [\n { alignment },\n { hover },\n { alignment },\n { isMinSm },\n { isMinMd },\n { isMinLg },\n { isMinXl },\n { leftTileMedium: leftTile && isMinMd },\n { rightTileMedium: rightTile && isMinMd },\n { leftTileLarge: leftTile && isMinLg },\n { tilesStartLarge: isMinLg && tilesSide === TilesSide.START },\n ]);\n};\n","import React from 'react';\nimport Tile, { TileProps } from './Tile';\nimport useStylesheet from './Tiles.stylesheet';\nimport { gu2px, useTheme } from '@ux/theme-utils';\nimport { Layout } from 'domain/constants/layout';\n\ninterface OuterProps {\n tiles: TileProps[],\n hBaseline: number,\n layout: Layout,\n}\n\nconst tileAnimation = (spacing: number) => `@keyframes arrowAnimation {\n from {\n right: ${gu2px(3, spacing)}px;\n opacity: 0.1;\n }\n to {\n right: ${gu2px(0, spacing)}px;\n opacity: 1;\n }\n}`;\n\ndeclare const i: number;\ndeclare const tile: TileProps;\n\nexport const PureTiles = ({\n tiles,\n hBaseline,\n layout,\n}: OuterProps) => {\n const {\n theme,\n } = useTheme();\n const {\n styles,\n } = useStylesheet();\n return (\n \n );\n};\n\nPureTiles.displayName = 'Tiles';\n\nexport default PureTiles;\n","import { useStyles } from '@team-griffin/stylr';\nimport { useBreakpoints } from '@ux/responsive';\n\nexport default () => {\n const {\n isMinMd,\n isMinLg,\n } = useBreakpoints();\n return useStyles({\n default: {\n tile: {\n flex: 1,\n flexBasis: 'auto',\n // Safari is not filling 100% height of flex parent\n // in nested flex containers\n WebkitFlexBasis: 0,\n position: 'relative',\n },\n },\n isMinMd: {\n root: {\n flexDirection: 'row',\n display: 'flex',\n },\n tile: {\n width: '50%',\n },\n },\n isMinLg: {\n root: {\n flexDirection: 'column',\n height: '100%',\n },\n tile: {\n width: '100%',\n },\n },\n }, [\n { isMinMd },\n { isMinLg },\n ]);\n};\n","import React from 'react';\nimport { Container, Row, Column, Direction, Justify } from '@ux/grid';\nimport Background, { BackgroundArray } from 'components/common/Background';\nimport Body, { OuterProps as BodyProps } from '../Body';\nimport Scroll from '../Scroll';\nimport Tiles from '../Tiles';\nimport PaddingBox, { Side } from '@ux/padding-box';\nimport { useBreakpoints } from '@ux/responsive';\nimport { Side as TilesSide } from '../constants';\nimport useStylesheet from './WithTiles.stylesheet';\nimport { TileProps } from '../Tile';\nimport { isNilOrEmpty } from 'presentation/utils/generalUtils';\n\ninterface OuterProps extends BodyProps {\n showScroll: boolean,\n background: BackgroundArray,\n onScrollClick: (evt: any) => any,\n justify: Justify,\n hideGradient?: boolean,\n tiles: TileProps[],\n}\n\nexport const PureBillboardTiles = ({\n layout,\n colorway,\n hBaseline,\n ctas,\n text,\n additionalText,\n footerText,\n tiles,\n onScrollClick,\n justify,\n showScroll,\n ribbonId,\n background,\n hideGradient,\n}: OuterProps) => {\n const breakpoints = useBreakpoints();\n const {\n isMinLg,\n } = breakpoints;\n const {\n styles,\n } = useStylesheet({\n layout,\n ...breakpoints,\n });\n const hasFooterText = !isNilOrEmpty(footerText);\n const direction = layout.tilesSide === TilesSide.END ? Direction.ROW : Direction.ROW_REVERSE;\n return (\n <>\n \n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n
\n
\n
\n \n \n \n
\n
\n \n
\n \n {footerText}\n \n \n
\n \n \n \n
\n \n \n \n >\n );\n};\n\nPureBillboardTiles.displayName = 'BillboardTiles';\n\nexport default PureBillboardTiles;\n","import { useStyles } from '@team-griffin/stylr';\nimport { getActiveAnchor, halfContainerWidth } from '../styles';\nimport { BreakpointProps, breakpoints } from '@ux/responsive';\nimport cssSides, { Side } from '@team-griffin/css-sides';\nimport { gu2px, useTheme } from '@ux/theme-utils';\nimport ribbonPadding from 'presentation/utils/ribbonPadding';\nimport { Side as TilesSide } from '../constants';\nimport { Layout } from 'domain/constants/layout';\n\nexport default ({\n layout,\n isMinSm,\n isMinMd,\n isMinLg,\n isMinXl,\n}: {\n layout: Layout,\n} & BreakpointProps) => {\n const {\n theme,\n } = useTheme();\n const {\n spacing,\n } = theme;\n\n const {\n anchor,\n tilesSide,\n } = layout;\n\n const activeAnchor = getActiveAnchor(anchor, {\n isMinSm,\n isMinMd,\n isMinLg,\n isMinXl,\n });\n\n return useStyles({\n default: {\n content: {\n flex: 1,\n flexBasis: 'auto',\n justifyContent: activeAnchor,\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n ...ribbonPadding({\n spacing,\n isMinSm,\n isMinLg,\n }),\n },\n body: {\n flex: 1,\n flexBasis: 'auto',\n },\n },\n\n isMinLg: {\n container: {\n ...cssSides('padding', Side.X, gu2px(1, spacing)),\n display: 'flex',\n flex: 1,\n flexBasis: 'auto',\n // Safari is not filling 100% height of flex parent\n // in nested flex containers\n webkitFlexBasis: 0,\n width: '100%',\n maxWidth: '100%',\n },\n row: {\n width: '100%',\n },\n content: {\n marginLeft: 'auto',\n maxWidth: halfContainerWidth(breakpoints.lg, spacing),\n height: '100%',\n position: 'static',\n },\n },\n\n isMinXl: {\n content: {\n maxWidth: halfContainerWidth(breakpoints.xl, spacing),\n },\n },\n\n lgStartTile: {\n content: {\n marginLeft: 0,\n marginRight: 'auto',\n },\n },\n }, [\n { isMinSm },\n { isMinLg },\n { isMinXl },\n { lgStartTile: tilesSide === TilesSide.START && isMinLg },\n ]);\n};\n","import React, { ComponentClass, ReactNode, useState } from 'react';\nimport Ribbon from '../Ribbon';\nimport findResponsiveItem from 'presentation/utils/findResponsiveItem';\nimport visibilitySet from 'presentation/hocs/visibilitySet';\nimport { Fit, RibbonProps } from 'domain/constants/ribbons';\nimport { scroller, Element } from 'react-scroll';\nimport { ulid } from 'ulid';\nimport CornerEmbellishments, { CornerEmbellishmentsType } from './CornerEmbellishments';\nimport BillboardGeneric from './layouts/Generic';\nimport BillboardDuo from './layouts/Duo';\nimport BillboardTiles from './layouts/WithTiles';\nimport errorBoundary from 'presentation/hocs/errorBoundary';\nimport { OuterProps as BodyProps } from './Body';\nimport { useBreakpoints } from '@ux/responsive';\nimport { Layout } from 'domain/constants/layout';\nimport { TileProps } from './Tile';\nimport { Theme } from '@ux/theme-utils';\nimport { Justify } from '@ux/grid';\nimport { Background } from 'components/common/Background';\n\nexport interface OuterProps extends BodyProps, RibbonProps {\n cornerEmbellishments?: CornerEmbellishmentsType,\n tiles?: TileProps[],\n additionalText?: ReactNode,\n footerText?: ReactNode,\n duo?: boolean,\n duoLayout?: boolean,\n name: string,\n loading: boolean,\n id: string,\n justify: Justify,\n theme: Theme,\n background: [Background, Background, Background],\n hideGradient?: boolean,\n}\ninterface LayoutProps extends OuterProps {\n duoLayout: boolean,\n hasTiles: boolean,\n showScroll: boolean,\n onScrollClick: () => void,\n setBottomScrollName: (v: string) => void,\n tiles: TileProps[],\n}\n\nconst hasTwoTiles = (tiles: TileProps[]) => tiles?.length === 2;\n\nconst shouldShowScroll = (props: {\n layout: Layout,\n isMinSm: boolean,\n isMinMd: boolean,\n isMinLg: boolean,\n isMinXl: boolean,\n}) => {\n const {\n isMinSm,\n isMinMd,\n isMinLg,\n isMinXl,\n layout,\n } = props;\n if (props.isMinSm) {\n const fitSet = layout.fit;\n const fit = findResponsiveItem({\n isMinSm,\n isMinMd,\n isMinLg,\n isMinXl,\n }, fitSet);\n return fit === Fit.FILL || fit === Fit.FULLSCREEN;\n }\n return false;\n};\n\n\nconst BillboardLayout = ({\n hasTiles,\n ...props\n}: LayoutProps) => {\n const duoLayout = props.duoLayout;\n if (hasTiles) {\n return ;\n }\n if (duoLayout) {\n return ;\n }\n return ;\n};\n\nexport const PureBillboard = ({\n id,\n theme,\n layout,\n loading,\n colorway,\n name,\n duoLayout,\n cornerEmbellishments,\n ctas = [],\n additionalText = null,\n footerText = null,\n duo = false,\n tiles,\n ...props\n}: OuterProps) => {\n const breakpoints = useBreakpoints();\n\n const showScroll = shouldShowScroll({\n layout,\n ...breakpoints,\n });\n\n const hasTiles = hasTwoTiles(tiles) && duo === false;\n\n const [ bottomScrollName, setBottomScrollName ] = useState(() => {\n return ulid();\n });\n const scrollHandler = ({ bottomScrollName }: { bottomScrollName: string }) => () => {\n scroller.scrollTo(bottomScrollName, {\n duration: 500,\n delay: 100,\n smooth: true,\n });\n };\n const onScrollClick = scrollHandler({ bottomScrollName });\n return (\n <>\n \n \n \n \n \n >\n );\n};\n\nPureBillboard.displayName = 'Billboard';\n\nexport default errorBoundary(visibilitySet(PureBillboard)) as ComponentClass;\n","import Billboard, { OuterProps } from './Billboard';\nimport { Side } from './constants';\n\nexport {\n Side,\n OuterProps as BillboardProps,\n};\nexport default Billboard;"],"sourceRoot":""}