{"version":3,"sources":["webpack:///./src/components/Image/ImgElement.js","webpack:///./src/components/Image/Image.js","webpack:///./src/components/CtaLink/CtaLink.js","webpack:///./src/components/Image/imgix-support.js","webpack:///./src/components/Image/helpers.js"],"names":["getObjectPosition","alignX","alignY","concat","undefined","Img","styled","img","withConfig","displayName","componentId","_ref","blurred","_ref2","show","_ref3","hide","_ref4","zoomOnHover","ImgElement","_ref5","src","alt","contain","cover","onLoad","props","_objectWithoutProperties","_excluded","_useState2","_slicedToArray","useState","renderAsDiv","setRenderAsDiv","useEffect","objectFitSupport","React","createElement","Object","assign","as","style","backgroundImage","backgroundSize","backgroundPosition","objectPosition","objectFit","role","defaultProps","Container","div","fillContainer","aspect","Image","_PureComponent","_inherits","_super","_createSuper","_this","_classCallCheck","_len","arguments","length","args","Array","_key","call","apply","state","ready","animatedIn","elementWidth","elementHeight","timeout","handleLoad","fadeIn","setState","setTimeout","handleTransitionEnd","handleError","handleMeasure","contentRect","Math","ceil","bounds","width","height","onResize","key","value","maxAspectRatio","aspectRatio","min","_objectSpread","fit","crop","focalPoint","auto","x","y","imgixParams","imgixProps","processImage","imageDimensionMap","w","h","dpr","q","blur","this","clearTimeout","_this2","_this$props","disableBlur","className","_this$state","generateImgixProps","currentSrc","generateSource","generateAspectRatio","Measure","measureRef","ref","generateBlurredSource","aria-hidden","onError","onTransitionEnd","PureComponent","withImgix","Base","BaseButton","getFontSize","size","secondaryFontFamily","theme","invert","textInvert","primary","accent","Label","span","durations","fast","p","align","CtaLink","_React$Component","renderInner","hovering","children","label","_this$props2","rest","normalizedWidth","imageQuality","constructUrl","params","preparedParams","keys","filter","k","map","encodeURIComponent","join","Component","InjectedComponent","ConfigContext","Consumer","config","imgixDomain","options","includes","global","devicePixelRatio","supports","document","body"],"mappings":"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","file":"static/scripts/5-dac9f45291503c4964a1.js","sourcesContent":["// @flow\nimport React, { useEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { objectFitSupport } from './helpers'\n\nfunction getObjectPosition(alignX, alignY) {\n return alignX || alignY\n ? `${alignX || 'center'} ${alignY || 'center'}`\n : undefined\n}\n\nconst Img = styled.img`\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n max-width: none;\n object-fit: cover;\n object-position: center;\n ${({ blurred }) =>\n blurred &&\n `\n opacity: 0.4;\n `}\n\n ${({ show }) =>\n show &&\n `\n transition: opacity 0.4s linear;\n will-change: opacity;\n opacity: 1;\n `}\n\n ${({ hide }) =>\n hide &&\n `\n opacity: 0;\n will-change: opacity;\n `}\n\n ${({ zoomOnHover }) =>\n zoomOnHover &&\n `\n transition: transform 2s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;\n &:hover {\n transform: scale(1.1);\n }\n `} \n`\n\ntype Props = {\n src: string,\n alignX?: 'left' | 'center' | 'right',\n alignY?: 'top' | 'center' | 'bottom',\n alt?: string,\n contain?: boolean,\n cover?: boolean,\n onLoad?: Function,\n blurred?: boolean,\n show?: boolean,\n hide?: boolean,\n zoomOnHover?: boolean,\n}\n\n/**\n * Img Element with ObjectFit fallback in unsupported browsers (IE)\n */\nfunction ImgElement({\n src,\n alt,\n contain,\n cover,\n alignX,\n alignY,\n onLoad,\n blurred,\n ...props\n}: Props) {\n /**\n * If this Image requires unsupported ObjectFit, fallback to a
with backgroundImage\n **/\n const [renderAsDiv, setRenderAsDiv] = useState(false)\n useEffect(() => {\n setRenderAsDiv(\n (alignX || alignY || contain || cover) && !objectFitSupport(),\n )\n }, [])\n\n if (renderAsDiv) {\n if (onLoad) {\n // Trigger the onLoad - could create a dummy image instead that triggers it after the image is actually loaded.\n onLoad()\n }\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nImgElement.defaultProps = {\n contain: false,\n}\n\nexport default ImgElement\n","// @flow\nimport React, { PureComponent } from 'react'\nimport Measure from 'react-measure'\nimport styled from 'styled-components'\n\nimport type { ImageViewModel } from '../../types/ImageViewModel'\nimport type { Bounds, Rect } from './types'\n\nimport processImage, { imageDimensionMap, withImgix } from './imgix-support'\nimport ImgElement from './ImgElement'\n\nconst Container = styled.div`\n position: relative;\n width: 100%;\n ${({ fillContainer }) =>\n fillContainer &&\n `\n position: absolute;\n height: 100%;\n top: 0;\n left: 0;\n `} ${({ aspect }) =>\n aspect &&\n `\n padding-bottom: ${aspect * 100}%;\n `};\n ${({ zoomOnHover }) =>\n zoomOnHover &&\n `\n overflow: hidden\n `}\n`\n\ntype Props = ImageViewModel & {\n onResize?: (bounds: Bounds) => void,\n className?: string,\n zoomOnHover?: boolean,\n}\n\ntype State = {\n animatedIn: boolean,\n ready: boolean,\n elementWidth: number,\n elementHeight: number,\n}\n\n/**\n * Image handles fetching the correct Imgix image, and rendering it onto the page.\n * By default it will load an image that fillContainers the width of it's container, while keeping the original image aspect ratio\n */\nclass Image extends PureComponent {\n static displayName = 'Image'\n static defaultProps = {\n maxAspectRatio: 2,\n width: 1,\n height: 1,\n }\n\n static generateAspectRatio(\n width: number = 1,\n height: number = 1,\n maxAspectRatio: number = 1,\n aspectRatio?: number,\n ) {\n if (aspectRatio) {\n return aspectRatio\n }\n return Math.min(maxAspectRatio, height / width)\n }\n\n static generateImgixProps(props: Props) {\n return {\n fit: props.contain ? 'clip' : 'crop',\n crop: !props.contain\n ? props.focalPoint\n ? 'focalpoint'\n : props.crop\n : undefined,\n auto: ['compress', 'format'],\n 'fp-x': props.focalPoint ? props.focalPoint.x : undefined,\n 'fp-y': props.focalPoint ? props.focalPoint.y : undefined,\n ...props.imgixParams,\n }\n }\n\n static generateSource(\n src: string,\n width: number,\n height: number,\n imgixProps?: Object,\n ) {\n if (width > 0 && height > 0) {\n return processImage(src, {\n ...imgixProps,\n ...imageDimensionMap(width, height),\n })\n }\n\n return null\n }\n\n static generateBlurredSource(\n src: string,\n width: number = 1,\n height: number = 1,\n imgixProps: Object = {},\n ) {\n return processImage(src, {\n ...imgixProps,\n w: Math.ceil(64),\n h: Math.ceil((height / width) * 64),\n dpr: 1,\n q: 50,\n blur: 64,\n })\n }\n\n state = {\n ready: false,\n animatedIn: false,\n elementWidth: 0,\n elementHeight: 0,\n }\n\n timeout = null\n\n componentWillUnmount() {\n if (this.timeout) clearTimeout(this.timeout)\n }\n\n handleLoad = () => {\n if (this.props.fadeIn) {\n this.setState({ ready: true })\n this.timeout = setTimeout(() => {\n this.timeout = null\n this.setState({ animatedIn: true })\n }, 1000)\n } else {\n this.setState({ ready: true, animatedIn: true })\n }\n }\n\n handleTransitionEnd = () => {\n if (this.state.ready) {\n this.setState({ animatedIn: true })\n }\n }\n\n handleError = () => {\n this.setState({ ready: true, animatedIn: true })\n }\n\n handleMeasure = (contentRect: Rect) => {\n this.setState({\n elementWidth: Math.ceil(contentRect.bounds.width),\n elementHeight: Math.ceil(contentRect.bounds.height),\n })\n\n if (this.props.onResize) this.props.onResize(contentRect.bounds)\n }\n\n render() {\n const {\n src,\n fadeIn,\n disableBlur,\n maxAspectRatio,\n fillContainer,\n contain,\n cover,\n alignX,\n alignY,\n width,\n height,\n alt,\n className,\n zoomOnHover,\n aspectRatio,\n } = this.props\n\n const { ready, animatedIn, elementWidth, elementHeight } = this.state\n const imgixProps = Image.generateImgixProps(this.props)\n const currentSrc = Image.generateSource(\n src,\n elementWidth,\n elementHeight,\n imgixProps,\n )\n\n const aspect = !fillContainer\n ? Image.generateAspectRatio(width, height, maxAspectRatio, aspectRatio)\n : null\n\n return (\n \n {({ measureRef }) => {\n return (\n \n {!disableBlur && fadeIn && !animatedIn ? (\n \n ) : null}\n {currentSrc || (!fadeIn && !disableBlur) ? (\n \n ) : null}\n \n )\n }}\n \n )\n }\n}\n\nexport default withImgix(Image)\n","// @flow\nimport * as React from 'react'\nimport styled from 'styled-components'\nimport BaseButton from '../Button/BaseButton'\nimport type { LinkViewModel } from '../../types/LinkViewModel'\nimport { secondaryFontFamily } from '../../styles/theme'\nimport type { ButtonState } from '../Button/BaseButton'\nimport { getFontSize } from '../../styles/style-helpers'\nimport { durations } from '../../styles/animations'\n\ntype Props = LinkViewModel & {\n children?: React.Node,\n /** Always render as anchor tag, don't fall back to button */\n isAnchor?: boolean,\n disabled?: boolean,\n size: 'small' | 'normal',\n invert?: boolean,\n}\n\ntype AlignProps = {\n align: 'left' | 'right',\n}\n\ntype State = {}\n\nconst Base = styled(BaseButton)`\n && {\n display: inline-block;\n font-size: ${(props: Props) => getFontSize(props.size)};\n font-family: ${secondaryFontFamily};\n text-decoration: underline;\n line-height: 1.25;\n text-align: left;\n max-width: 100%;\n transform: translateX(-0.5rem);\n }\n`\n\nconst Container = styled.div`\n position: relative;\n padding: 0.5rem;\n color: ${({ theme, invert }) => (invert ? theme.textInvert : theme.primary)};\n :hover {\n color: ${({ theme }) => theme.accent};\n }\n`\n\nconst Label = styled.span`\n transition: color ${durations.fast} ease-out;\n margin-left: ${(p: AlignProps) => (p.align === 'left' ? '22px' : null)};\n margin-right: ${(p: AlignProps) => (p.align === 'right' ? '22px' : null)};\n`\n\nclass CtaLink extends React.Component {\n static displayName = 'CtaLink'\n static defaultProps = {\n size: 'normal',\n }\n\n renderInner = ({ hovering }: ButtonState) => {\n const { children, label, invert } = this.props\n return (\n \n \n \n )\n }\n\n render() {\n const { children, ...rest } = this.props\n return {this.renderInner}\n }\n}\n\nexport default CtaLink\n","// @flow\nimport * as React from 'react'\nimport { ConfigContext } from '../../App/AppShell'\n\n/* eslint-disable no-param-reassign */\nexport const imageDimensionMap = (\n width: number,\n height: number,\n): { w: number, h: number } => {\n const aspect = height / width\n const normalizedWidth = Math.ceil(width)\n const normalizedHeight = Math.ceil(aspect * normalizedWidth)\n\n return {\n w: normalizedWidth,\n h: normalizedHeight,\n }\n}\n\nfunction imageQuality(dpr: number = 1) {\n return dpr >= 3 ? 30 : dpr === 2 ? 40 : undefined\n}\n\nfunction constructUrl(src, params) {\n const preparedParams = Object.keys(params)\n .filter(k => typeof params[k] !== 'undefined')\n .map(k => `${k}=${encodeURIComponent(params[k])}`)\n .join('&')\n\n return `${src}?${preparedParams}`\n}\n\n/**\n * Construct a URL for an image with an Imgix proxy, expanding image options\n * per the [API reference docs](https://www.imgix.com/docs/reference).\n * @param {String} src src of raw image\n * @param {Object} options map of image API options, in long or short form per expansion rules\n * @return {String} URL of image src transformed by Imgix\n */\nfunction processImage(src: string, options: Object = {}): string {\n if (!src) {\n return ''\n }\n if (!src.includes('imgix.net')) return src\n\n return constructUrl(src, {\n auto: 'format',\n dpr: global.devicePixelRatio || 1,\n q: imageQuality(global.devicePixelRatio),\n ...options,\n })\n}\n\nexport default processImage\n\nexport function withImgix(Component: React.ComponentType) {\n class InjectedComponent extends React.Component {\n render() {\n // todo: maybe check if already has protocol and domain\n if (process.env.NODE_ENV === 'development') {\n return \n }\n\n return (\n \n {config => (\n \n )}\n \n )\n }\n }\n\n return InjectedComponent\n}\n","// @flow\nimport type { ImageRatio } from './types'\n\nconst supports = {}\n\n/**\n * Detect if objectFit is supported on the client\n * @type {boolean}\n */\nexport function objectFitSupport(): boolean {\n if (!supports.objectFit) {\n supports.objectFit = global.document\n ? global.document.body.style.objectFit !== undefined\n : true\n }\n\n return supports.objectFit\n}\n\nexport default {\n objectFitSupport,\n}\n\nexport function generateSrc(\n url: string,\n width: number,\n ratio?: ImageRatio = 'original',\n) {\n if (url && !url.includes('/static/')) {\n const pos = url.lastIndexOf('/')\n return `${url.substr(0, pos)}/${ratio}/${width}/${url.substr(pos + 1)}`\n }\n\n return `${url}?w=${width}&ratio=${ratio || ''}`\n}\n"],"sourceRoot":""}