{"version":3,"file":"component---src-templates-demand-academy-post-js-bfa66a63502c2d5a2135.js","mappings":"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","sources":["webpack://parrot-analytics-gatsby/./node_modules/camelcase/index.js","webpack://parrot-analytics-gatsby/../src/image-utils.ts","webpack://parrot-analytics-gatsby/../src/components/hooks.ts","webpack://parrot-analytics-gatsby/../src/components/layout-wrapper.tsx","webpack://parrot-analytics-gatsby/../src/components/picture.tsx","webpack://parrot-analytics-gatsby/../src/components/placeholder.tsx","webpack://parrot-analytics-gatsby/../src/components/main-image.tsx","webpack://parrot-analytics-gatsby/../src/components/gatsby-image.server.tsx","webpack://parrot-analytics-gatsby/../src/components/gatsby-image.browser.tsx","webpack://parrot-analytics-gatsby/../src/components/static-image.server.tsx","webpack://parrot-analytics-gatsby/../src/components/static-image.tsx","webpack://parrot-analytics-gatsby/./src/images/icons/da-video.svg","webpack://parrot-analytics-gatsby/./src/components/demand-academy/basic-info.js","webpack://parrot-analytics-gatsby/./src/images/icons/da-arrow.svg","webpack://parrot-analytics-gatsby/./src/components/demand-academy/index-card.js","webpack://parrot-analytics-gatsby/./src/components/demand-academy/sections-menu.js","webpack://parrot-analytics-gatsby/./src/components/demand-academy-post.js","webpack://parrot-analytics-gatsby/./src/images/icons/da-open.svg","webpack://parrot-analytics-gatsby/./src/templates/demand-academy-post.js","webpack://parrot-analytics-gatsby/./src/utils/brand-node.js","webpack://parrot-analytics-gatsby/./src/utils/demand-academy.js","webpack://parrot-analytics-gatsby/./src/images/icons/da-pdf.svg"],"sourcesContent":["'use strict';\n\nconst preserveCamelCase = string => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = Object.assign({\n\t\tpascalCase: false\n\t}, options);\n\n\tconst postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? input.toUpperCase() : input.toLowerCase();\n\t}\n\n\tconst hasUpperCase = input !== input.toLowerCase();\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input);\n\t}\n\n\tinput = input\n\t\t.replace(/^[_.\\- ]+/, '')\n\t\t.toLowerCase()\n\t\t.replace(/[_.\\- ]+(\\w|$)/g, (_, p1) => p1.toUpperCase())\n\t\t.replace(/\\d+(\\w|$)/g, m => m.toUpperCase());\n\n\treturn postProcess(input);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","import camelCase from \"camelcase\"\nimport type { IGatsbyImageData } from \"./index\"\n\nconst DEFAULT_PIXEL_DENSITIES = [0.25, 0.5, 1, 2]\nexport const DEFAULT_BREAKPOINTS = [750, 1080, 1366, 1920]\nexport const EVERY_BREAKPOINT = [\n 320, 654, 768, 1024, 1366, 1600, 1920, 2048, 2560, 3440, 3840, 4096,\n]\nconst DEFAULT_FLUID_WIDTH = 800\nconst DEFAULT_FIXED_WIDTH = 800\nconst DEFAULT_ASPECT_RATIO = 4 / 3\n\nexport type Fit = \"cover\" | \"fill\" | \"inside\" | \"outside\" | \"contain\"\n\nexport type Layout = \"fixed\" | \"fullWidth\" | \"constrained\"\nexport type ImageFormat = \"jpg\" | \"png\" | \"webp\" | \"avif\" | \"auto\" | \"\"\n\n/**\n * The minimal required reporter, as we don't want to import it from gatsby-cli\n */\nexport interface IReporter {\n warn(message: string): void\n}\n\nexport interface ISharpGatsbyImageArgs {\n layout?: Layout\n formats?: Array\n placeholder?: \"tracedSVG\" | \"dominantColor\" | \"blurred\" | \"none\"\n tracedSVGOptions?: Record\n width?: number\n height?: number\n aspectRatio?: number\n sizes?: string\n quality?: number\n transformOptions?: {\n fit?: Fit\n cropFocus?: number | string\n duotone?: {\n highlight: string\n shadow: string\n opacity?: number\n }\n grayscale?: boolean\n rotate?: number\n trim?: number\n }\n jpgOptions?: Record\n pngOptions?: Record\n webpOptions?: Record\n avifOptions?: Record\n blurredOptions?: { width?: number; toFormat?: ImageFormat }\n breakpoints?: Array\n outputPixelDensities?: Array\n backgroundColor?: string\n}\n\nexport interface IImageSizeArgs {\n width?: number\n height?: number\n layout?: Layout\n filename: string\n outputPixelDensities?: Array\n breakpoints?: Array\n fit?: Fit\n reporter?: IReporter\n sourceMetadata: { width: number; height: number }\n}\n\nexport interface IImageSizes {\n sizes: Array\n presentationWidth: number\n presentationHeight: number\n aspectRatio: number\n unscaledWidth: number\n}\n\nexport interface IImage {\n src: string\n width: number\n height: number\n format: ImageFormat\n}\n\nexport interface IGatsbyImageHelperArgs {\n pluginName: string\n generateImageSource: (\n filename: string,\n width: number,\n height: number,\n format: ImageFormat,\n fit?: Fit,\n options?: Record\n ) => IImage\n layout?: Layout\n formats?: Array\n filename: string\n placeholderURL?: string\n width?: number\n height?: number\n sizes?: string\n reporter?: IReporter\n sourceMetadata?: { width: number; height: number; format: ImageFormat }\n fit?: Fit\n options?: Record\n breakpoints?: Array\n backgroundColor?: string\n aspectRatio?: number\n}\n\nconst warn = (message: string): void => console.warn(message)\n\nconst sortNumeric = (a: number, b: number): number => a - b\n\nexport const getSizes = (width: number, layout: Layout): string | undefined => {\n switch (layout) {\n // If screen is wider than the max size, image width is the max size,\n // otherwise it's the width of the screen\n case `constrained`:\n return `(min-width: ${width}px) ${width}px, 100vw`\n\n // Image is always the same width, whatever the size of the screen\n case `fixed`:\n return `${width}px`\n\n // Image is always the width of the screen\n case `fullWidth`:\n return `100vw`\n\n default:\n return undefined\n }\n}\n\nexport const getSrcSet = (images: Array): string =>\n images.map(image => `${image.src} ${image.width}w`).join(`,\\n`)\n\nexport function formatFromFilename(filename: string): ImageFormat | undefined {\n const dot = filename.lastIndexOf(`.`)\n if (dot !== -1) {\n const ext = filename.slice(dot + 1)\n if (ext === `jpeg`) {\n return `jpg`\n }\n if (ext.length === 3 || ext.length === 4) {\n return ext as ImageFormat\n }\n }\n return undefined\n}\n\nexport function setDefaultDimensions(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageHelperArgs {\n let {\n layout = `constrained`,\n width,\n height,\n sourceMetadata,\n breakpoints,\n aspectRatio,\n formats = [`auto`, `webp`],\n } = args\n formats = formats.map(format => format.toLowerCase() as ImageFormat)\n layout = camelCase(layout) as Layout\n\n if (width && height) {\n return { ...args, formats, layout, aspectRatio: width / height }\n }\n if (sourceMetadata.width && sourceMetadata.height && !aspectRatio) {\n aspectRatio = sourceMetadata.width / sourceMetadata.height\n }\n\n if (layout === `fullWidth`) {\n width = width || sourceMetadata.width || breakpoints[breakpoints.length - 1]\n height = height || Math.round(width / (aspectRatio || DEFAULT_ASPECT_RATIO))\n } else {\n if (!width) {\n if (height && aspectRatio) {\n width = height * aspectRatio\n } else if (sourceMetadata.width) {\n width = sourceMetadata.width\n } else if (height) {\n width = Math.round(height / DEFAULT_ASPECT_RATIO)\n } else {\n width = DEFAULT_FIXED_WIDTH\n }\n }\n\n if (aspectRatio && !height) {\n height = Math.round(width / aspectRatio)\n } else if (!aspectRatio) {\n aspectRatio = width / height\n }\n }\n return { ...args, width, height, aspectRatio, layout, formats }\n}\n\n/**\n * Use this for getting an image for the blurred placeholder. This ensures the\n * aspect ratio and crop match the main image\n */\nexport function getLowResolutionImageURL(\n args: IGatsbyImageHelperArgs,\n width = 20\n): string {\n args = setDefaultDimensions(args)\n const { generateImageSource, filename, aspectRatio } = args\n return generateImageSource(\n filename,\n width,\n Math.round(width / aspectRatio),\n args.sourceMetadata.format || `jpg`,\n args.fit,\n args.options\n )?.src\n}\n\nexport function generateImageData(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageData {\n args = setDefaultDimensions(args)\n\n let {\n pluginName,\n sourceMetadata,\n generateImageSource,\n layout,\n fit,\n options,\n width,\n height,\n filename,\n reporter = { warn },\n backgroundColor,\n placeholderURL,\n } = args\n\n if (!pluginName) {\n reporter.warn(\n `[gatsby-plugin-image] \"generateImageData\" was not passed a plugin name`\n )\n }\n\n if (typeof generateImageSource !== `function`) {\n throw new Error(`generateImageSource must be a function`)\n }\n\n if (!sourceMetadata || (!sourceMetadata.width && !sourceMetadata.height)) {\n // No metadata means we let the CDN handle max size etc, aspect ratio etc\n sourceMetadata = {\n width,\n height,\n format: sourceMetadata?.format || formatFromFilename(filename) || `auto`,\n }\n } else if (!sourceMetadata.format) {\n sourceMetadata.format = formatFromFilename(filename)\n }\n\n const formats = new Set(args.formats)\n\n if (formats.size === 0 || formats.has(`auto`) || formats.has(``)) {\n formats.delete(`auto`)\n formats.delete(``)\n formats.add(sourceMetadata.format)\n }\n\n if (formats.has(`jpg`) && formats.has(`png`)) {\n reporter.warn(\n `[${pluginName}] Specifying both 'jpg' and 'png' formats is not supported. Using 'auto' instead`\n )\n if (sourceMetadata.format === `jpg`) {\n formats.delete(`png`)\n } else {\n formats.delete(`jpg`)\n }\n }\n\n const imageSizes = calculateImageSizes({ ...args, sourceMetadata })\n\n const result: IGatsbyImageData[\"images\"] = {\n sources: [],\n }\n\n let sizes = args.sizes\n if (!sizes) {\n sizes = getSizes(imageSizes.presentationWidth, layout)\n }\n\n formats.forEach(format => {\n const images = imageSizes.sizes\n .map(size => {\n const imageSrc = generateImageSource(\n filename,\n size,\n Math.round(size / imageSizes.aspectRatio),\n format,\n fit,\n options\n )\n if (\n !imageSrc?.width ||\n !imageSrc.height ||\n !imageSrc.src ||\n !imageSrc.format\n ) {\n reporter.warn(\n `[${pluginName}] The resolver for image ${filename} returned an invalid value.`\n )\n return undefined\n }\n return imageSrc\n })\n .filter(Boolean)\n\n if (format === `jpg` || format === `png` || format === `auto`) {\n const unscaled =\n images.find(img => img.width === imageSizes.unscaledWidth) || images[0]\n\n if (unscaled) {\n result.fallback = {\n src: unscaled.src,\n srcSet: getSrcSet(images),\n sizes,\n }\n }\n } else {\n result.sources?.push({\n srcSet: getSrcSet(images),\n sizes,\n type: `image/${format}`,\n })\n }\n })\n\n const imageProps: Partial = {\n images: result,\n layout,\n backgroundColor,\n }\n\n if (placeholderURL) {\n imageProps.placeholder = { fallback: placeholderURL }\n }\n\n switch (layout) {\n case `fixed`:\n imageProps.width = imageSizes.presentationWidth\n imageProps.height = imageSizes.presentationHeight\n break\n\n case `fullWidth`:\n imageProps.width = 1\n imageProps.height = 1 / imageSizes.aspectRatio\n break\n\n case `constrained`:\n imageProps.width = args.width || imageSizes.presentationWidth || 1\n imageProps.height = (imageProps.width || 1) / imageSizes.aspectRatio\n }\n\n return imageProps as IGatsbyImageData\n}\n\nconst dedupeAndSortDensities = (values: Array): Array =>\n Array.from(new Set([1, ...values])).sort(sortNumeric)\n\nexport function calculateImageSizes(args: IImageSizeArgs): IImageSizes {\n const {\n width,\n height,\n filename,\n layout = `constrained`,\n sourceMetadata: imgDimensions,\n reporter = { warn },\n breakpoints = DEFAULT_BREAKPOINTS,\n } = args\n\n // check that all dimensions provided are positive\n const userDimensions = { width, height }\n const erroneousUserDimensions = Object.entries(userDimensions).filter(\n ([_, size]) => typeof size === `number` && size < 1\n )\n if (erroneousUserDimensions.length) {\n throw new Error(\n `Specified dimensions for images must be positive numbers (> 0). Problem dimensions you have are ${erroneousUserDimensions\n .map(dim => dim.join(`: `))\n .join(`, `)}`\n )\n }\n\n if (layout === `fixed`) {\n return fixedImageSizes(args)\n } else if (layout === `constrained`) {\n return responsiveImageSizes(args)\n } else if (layout === `fullWidth`) {\n return responsiveImageSizes({ breakpoints, ...args })\n } else {\n reporter.warn(\n `No valid layout was provided for the image at ${filename}. Valid image layouts are fixed, fullWidth, and constrained. Found ${layout}`\n )\n return {\n sizes: [imgDimensions.width],\n presentationWidth: imgDimensions.width,\n presentationHeight: imgDimensions.height,\n aspectRatio: imgDimensions.width / imgDimensions.height,\n unscaledWidth: imgDimensions.width,\n }\n }\n}\nexport function fixedImageSizes({\n filename,\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n reporter = { warn },\n}: IImageSizeArgs): IImageSizes {\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n if (!width) {\n if (!height) {\n width = DEFAULT_FIXED_WIDTH\n } else {\n width = Math.round(height * aspectRatio)\n }\n } else if (!height) {\n height = Math.round(width / aspectRatio)\n }\n\n const originalWidth = width // will use this for presentationWidth, don't want to lose it\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n\n // If the image is smaller than requested, warn the user that it's being processed as such\n // print out this message with the necessary information before we overwrite it for sizing\n if (isTopSizeOverriden) {\n const fixedDimension = imgDimensions.width < width ? `width` : `height`\n reporter.warn(`\nThe requested ${fixedDimension} \"${\n fixedDimension === `width` ? width : height\n }px\" for the image ${filename} was larger than the actual image ${fixedDimension} of ${\n imgDimensions[fixedDimension]\n }px. If possible, replace the current image with a larger one.`)\n\n if (fixedDimension === `width`) {\n width = imgDimensions.width\n height = Math.round(width / aspectRatio)\n } else {\n height = imgDimensions.height\n width = height * aspectRatio\n }\n }\n\n const sizes = densities\n .filter(size => size >= 1) // remove smaller densities because fixed images don't need them\n .map(density => Math.round(density * (width as number)))\n .filter(size => size <= imgDimensions.width)\n\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function responsiveImageSizes({\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n breakpoints,\n layout,\n}: IImageSizeArgs): IImageSizes {\n let sizes\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n // Case 1: width of height were passed in, make sure it isn't larger than the actual image\n width = width && Math.min(width, imgDimensions.width)\n height = height && Math.min(height, imgDimensions.height)\n\n // Case 2: neither width or height were passed in, use default size\n if (!width && !height) {\n width = Math.min(DEFAULT_FLUID_WIDTH, imgDimensions.width)\n height = width / aspectRatio\n }\n\n // if it still hasn't been found, calculate width from the derived height.\n // TS isn't smart enough to realise the type for height has been narrowed here\n if (!width) {\n width = (height as number) * aspectRatio\n }\n\n const originalWidth = width\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n if (isTopSizeOverriden) {\n width = imgDimensions.width\n height = imgDimensions.height\n }\n\n width = Math.round(width)\n\n if (breakpoints?.length > 0) {\n sizes = breakpoints.filter(size => size <= imgDimensions.width)\n\n // If a larger breakpoint has been filtered-out, add the actual image width instead\n if (\n sizes.length < breakpoints.length &&\n !sizes.includes(imgDimensions.width)\n ) {\n sizes.push(imgDimensions.width)\n }\n } else {\n sizes = densities.map(density => Math.round(density * (width as number)))\n sizes = sizes.filter(size => size <= imgDimensions.width)\n }\n\n // ensure that the size passed in is included in the final output\n if (layout === `constrained` && !sizes.includes(width)) {\n sizes.push(width)\n }\n sizes = sizes.sort(sortNumeric)\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function getDimensionsAndAspectRatio(\n dimensions,\n options\n): { width: number; height: number; aspectRatio: number } {\n // Calculate the eventual width/height of the image.\n const imageAspectRatio = dimensions.width / dimensions.height\n\n let width = options.width\n let height = options.height\n\n switch (options.fit) {\n case `fill`: {\n width = options.width ? options.width : dimensions.width\n height = options.height ? options.height : dimensions.height\n break\n }\n case `inside`: {\n const widthOption = options.width\n ? options.width\n : Number.MAX_SAFE_INTEGER\n const heightOption = options.height\n ? options.height\n : Number.MAX_SAFE_INTEGER\n\n width = Math.min(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.min(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n case `outside`: {\n const widthOption = options.width ? options.width : 0\n const heightOption = options.height ? options.height : 0\n\n width = Math.max(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.max(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n\n default: {\n if (options.width && !options.height) {\n width = options.width\n height = Math.round(options.width / imageAspectRatio)\n }\n\n if (options.height && !options.width) {\n width = Math.round(options.height * imageAspectRatio)\n height = options.height\n }\n }\n }\n\n return {\n width,\n height,\n aspectRatio: width / height,\n }\n}\n","/* global GATSBY___IMAGE */\nimport { generateImageData, EVERY_BREAKPOINT } from \"../image-utils\"\nimport type { CSSProperties, HTMLAttributes, ImgHTMLAttributes } from \"react\"\nimport type { Node } from \"gatsby\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { IGatsbyImageData } from \"./gatsby-image.browser\"\nimport type {\n IGatsbyImageHelperArgs,\n Layout,\n IImage,\n ImageFormat,\n} from \"../image-utils\"\n\n// Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\nexport const hasNativeLazyLoadSupport = (): boolean =>\n typeof HTMLImageElement !== `undefined` &&\n `loading` in HTMLImageElement.prototype\n\nexport function gatsbyImageIsInstalled(): boolean {\n return typeof GATSBY___IMAGE !== `undefined` && GATSBY___IMAGE\n}\n\nexport type IGatsbyImageDataParent = T & {\n gatsbyImageData: IGatsbyImageData\n}\nexport type IGatsbyImageParent = T & {\n gatsbyImage: IGatsbyImageData\n}\nexport type FileNode = Partial & {\n childImageSharp?: IGatsbyImageDataParent>\n}\n\nconst isGatsbyImageData = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageData | any\n): node is IGatsbyImageData =>\n // 🦆 check for a deep prop to be sure this is a valid gatsbyImageData object\n Boolean(node?.images?.fallback?.src)\n\nconst isGatsbyImageDataParent = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageDataParent | any\n): node is IGatsbyImageDataParent => Boolean(node?.gatsbyImageData)\n\nconst isGatsbyImageParent = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageParent | any\n): node is IGatsbyImageParent => Boolean(node?.gatsbyImage)\n\nexport type ImageDataLike =\n | FileNode\n | IGatsbyImageDataParent\n | IGatsbyImageParent\n | IGatsbyImageData\n\nexport const getImage = (\n node: ImageDataLike | null\n): IGatsbyImageData | undefined => {\n // This checks both for gatsbyImageData and gatsbyImage\n if (isGatsbyImageData(node)) {\n return node\n }\n // gatsbyImageData GraphQL field\n if (isGatsbyImageDataParent(node)) {\n return node.gatsbyImageData\n }\n // gatsbyImage GraphQL field for Gatsby's Image CDN service\n if (isGatsbyImageParent(node)) {\n return node.gatsbyImage\n }\n return node?.childImageSharp?.gatsbyImageData\n}\n\nexport const getSrc = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.src\n\nexport const getSrcSet = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.srcSet\n\nexport function getWrapperProps(\n width: number,\n height: number,\n layout: Layout\n): Pick, \"className\" | \"style\"> & {\n \"data-gatsby-image-wrapper\": string\n} {\n const wrapperStyle: CSSProperties = {}\n\n let className = `gatsby-image-wrapper`\n\n // If the plugin isn't installed we need to apply the styles inline\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.position = `relative`\n wrapperStyle.overflow = `hidden`\n }\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n } else if (layout === `constrained`) {\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.display = `inline-block`\n wrapperStyle.verticalAlign = `top`\n }\n className = `gatsby-image-wrapper gatsby-image-wrapper-constrained`\n }\n\n return {\n className,\n \"data-gatsby-image-wrapper\": ``,\n style: wrapperStyle,\n }\n}\n\nexport interface IUrlBuilderArgs {\n width: number\n height: number\n baseUrl: string\n format: ImageFormat\n options: OptionsType\n}\nexport interface IGetImageDataArgs> {\n baseUrl: string\n /**\n * For constrained and fixed images, the size of the image element\n */\n width?: number\n height?: number\n /**\n * If available, pass the source image width and height\n */\n sourceWidth?: number\n sourceHeight?: number\n /**\n * If only one dimension is passed, then this will be used to calculate the other.\n */\n aspectRatio?: number\n layout?: Layout\n /**\n * Returns a URL based on the passed arguments. Should be a pure function\n */\n urlBuilder: (args: IUrlBuilderArgs) => string\n\n /**\n * Should be a data URI\n */\n placeholderURL?: string\n backgroundColor?: string\n /**\n * Used in error messages etc\n */\n pluginName?: string\n\n /**\n * If you do not support auto-format, pass an array of image types here\n */\n formats?: Array\n\n breakpoints?: Array\n\n /**\n * Passed to the urlBuilder function\n */\n options?: OptionsType\n}\n\n/**\n * Use this hook to generate gatsby-plugin-image data in the browser.\n */\nexport function getImageData({\n baseUrl,\n urlBuilder,\n sourceWidth,\n sourceHeight,\n pluginName = `getImageData`,\n formats = [`auto`],\n breakpoints,\n options,\n ...props\n}: IGetImageDataArgs): IGatsbyImageData {\n if (\n !breakpoints?.length &&\n (props.layout === `fullWidth` || (props.layout as string) === `FULL_WIDTH`)\n ) {\n breakpoints = EVERY_BREAKPOINT\n }\n const generateImageSource = (\n baseUrl: string,\n width: number,\n height?: number,\n format?: ImageFormat\n ): IImage => {\n return {\n width,\n height,\n format,\n src: urlBuilder({ baseUrl, width, height, options, format }),\n }\n }\n\n const sourceMetadata: IGatsbyImageHelperArgs[\"sourceMetadata\"] = {\n width: sourceWidth,\n height: sourceHeight,\n format: `auto`,\n }\n\n const args: IGatsbyImageHelperArgs = {\n ...props,\n pluginName,\n generateImageSource,\n filename: baseUrl,\n formats,\n breakpoints,\n sourceMetadata,\n }\n return generateImageData(args)\n}\n\nexport function getMainProps(\n isLoading: boolean,\n isLoaded: boolean,\n images: IGatsbyImageData[\"images\"],\n loading?: \"eager\" | \"lazy\",\n style: CSSProperties = {}\n): Partial {\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n transform: `translateZ(0)`,\n transition: `opacity 250ms linear`,\n width: `100%`,\n willChange: `opacity`,\n ...style,\n }\n }\n\n const result = {\n ...images,\n loading,\n shouldLoad: isLoading,\n \"data-main-image\": ``,\n style: {\n ...style,\n opacity: isLoaded ? 1 : 0,\n },\n }\n\n return result\n}\n\nexport type PlaceholderImageAttrs = ImgHTMLAttributes &\n Pick & {\n \"data-placeholder-image\"?: string\n }\n\nexport function getPlaceholderProps(\n placeholder: PlaceholderImageAttrs | undefined,\n isLoaded: boolean,\n layout: Layout,\n width?: number,\n height?: number,\n backgroundColor?: string,\n objectFit?: CSSProperties[\"objectFit\"],\n objectPosition?: CSSProperties[\"objectPosition\"]\n): PlaceholderImageAttrs {\n const wrapperStyle: CSSProperties = {}\n\n if (backgroundColor) {\n wrapperStyle.backgroundColor = backgroundColor\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n wrapperStyle.backgroundColor = backgroundColor\n wrapperStyle.position = `relative`\n } else if (layout === `constrained`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n } else if (layout === `fullWidth`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n }\n }\n\n if (objectFit) {\n wrapperStyle.objectFit = objectFit\n }\n\n if (objectPosition) {\n wrapperStyle.objectPosition = objectPosition\n }\n const result: PlaceholderImageAttrs = {\n ...placeholder,\n \"aria-hidden\": true,\n \"data-placeholder-image\": ``,\n style: {\n opacity: isLoaded ? 0 : 1,\n transition: `opacity 500ms linear`,\n ...wrapperStyle,\n },\n }\n\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n result.style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n width: `100%`,\n }\n }\n\n return result\n}\n\nexport interface IArtDirectedImage {\n media: string\n image: IGatsbyImageData\n}\n\n/**\n * Generate a Gatsby image data object with multiple, art-directed images that display at different\n * resolutions.\n *\n * @param defaultImage The image displayed when no media query matches.\n * It is also used for all other settings applied to the image, such as width, height and layout.\n * You should pass a className to the component with media queries to adjust the size of the container,\n * as this cannot be adjusted automatically.\n * @param artDirected Array of objects which each contains a `media` string which is a media query\n * such as `(min-width: 320px)`, and the image object to use when that query matches.\n */\nexport function withArtDirection(\n defaultImage: IGatsbyImageData,\n artDirected: Array\n): IGatsbyImageData {\n const { images, placeholder, ...props } = defaultImage\n const output: IGatsbyImageData = {\n ...props,\n images: {\n ...images,\n sources: [],\n },\n placeholder: placeholder && {\n ...placeholder,\n sources: [],\n },\n }\n\n artDirected.forEach(({ media, image }) => {\n if (!media) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(\n \"[gatsby-plugin-image] All art-directed images passed to must have a value set for `media`. Skipping.\"\n )\n }\n return\n }\n\n if (\n image.layout !== defaultImage.layout &&\n process.env.NODE_ENV === `development`\n ) {\n console.warn(\n `[gatsby-plugin-image] Mismatched image layout: expected \"${defaultImage.layout}\" but received \"${image.layout}\". All art-directed images use the same layout as the default image`\n )\n }\n\n output.images.sources.push(\n ...image.images.sources.map(source => {\n return { ...source, media }\n }),\n {\n media,\n srcSet: image.images.fallback.srcSet,\n }\n )\n\n if (!output.placeholder) {\n return\n }\n\n output.placeholder.sources.push({\n media,\n srcSet: image.placeholder.fallback,\n })\n })\n output.images.sources.push(...images.sources)\n if (placeholder?.sources) {\n output.placeholder?.sources.push(...placeholder.sources)\n }\n return output\n}\n","import React, { Fragment, FunctionComponent } from \"react\"\nimport terserMacro from \"../../macros/terser.macro\"\nimport { Layout } from \"../image-utils\"\n\nexport interface ILayoutWrapperProps {\n layout: Layout\n width: number\n height: number\n}\n\nconst NativeScriptLoading: FunctionComponent = () => (\n \n)\n\nexport function getSizer(\n layout: Layout,\n width: number,\n height: number\n): string {\n let sizer = ``\n if (layout === `fullWidth`) {\n sizer = `
`\n }\n\n if (layout === `constrained`) {\n sizer = `
\"\"
`\n }\n\n return sizer\n}\n\nconst Sizer: FunctionComponent = function Sizer({\n layout,\n width,\n height,\n}) {\n if (layout === `fullWidth`) {\n return (\n
\n )\n }\n\n if (layout === `constrained`) {\n return (\n
\n \n
\n )\n }\n\n return null\n}\n\nexport const LayoutWrapper: FunctionComponent =\n function LayoutWrapper({ children, ...props }) {\n return (\n \n \n {children}\n\n {SERVER ? : null}\n \n )\n }\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\n\nexport interface IResponsiveImageProps {\n sizes?: string\n srcSet: string\n}\n\nexport type SourceProps = IResponsiveImageProps &\n (\n | {\n media: string\n type?: string\n }\n | {\n media?: string\n type: string\n }\n )\n\ntype FallbackProps = { src: string } & Partial\n\ntype ImageProps = ImgHTMLAttributes & {\n src: string\n alt: string\n shouldLoad: boolean\n}\n\nexport type PictureProps = ImgHTMLAttributes & {\n fallback?: FallbackProps\n sources?: Array\n alt: string\n shouldLoad?: boolean\n}\n\nconst Image: FunctionComponent = function Image({\n src,\n srcSet,\n loading,\n alt = ``,\n shouldLoad,\n ...props\n}) {\n return (\n \n )\n}\n\nexport const Picture: React.FC = function Picture({\n fallback,\n sources = [],\n shouldLoad = true,\n ...props\n}) {\n const sizes = props.sizes || fallback?.sizes\n const fallbackImage = (\n \n )\n\n if (!sources.length) {\n return fallbackImage\n }\n\n return (\n \n {sources.map(({ media, srcSet, type }) => (\n \n ))}\n {fallbackImage}\n \n )\n}\n\nImage.propTypes = {\n src: PropTypes.string.isRequired,\n alt: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string,\n shouldLoad: PropTypes.bool,\n}\n\nPicture.displayName = `Picture`\nPicture.propTypes = {\n alt: PropTypes.string.isRequired,\n shouldLoad: PropTypes.bool,\n fallback: PropTypes.exact({\n src: PropTypes.string.isRequired,\n srcSet: PropTypes.string,\n sizes: PropTypes.string,\n }),\n sources: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.exact({\n media: PropTypes.string.isRequired,\n type: PropTypes.string,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n PropTypes.exact({\n media: PropTypes.string,\n type: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n ])\n ),\n}\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\nimport { Picture, SourceProps } from \"./picture\"\n\nexport type PlaceholderProps = ImgHTMLAttributes & {\n fallback?: string\n sources?: Array\n}\n\nexport const Placeholder: FunctionComponent =\n function Placeholder({ fallback, ...props }) {\n if (fallback) {\n return (\n \n )\n } else {\n return
\n }\n }\n\nPlaceholder.displayName = `Placeholder`\nPlaceholder.propTypes = {\n fallback: PropTypes.string,\n sources: Picture.propTypes?.sources,\n alt: function (props, propName, componentName): Error | null {\n if (!props[propName]) {\n return null\n }\n\n return new Error(\n `Invalid prop \\`${propName}\\` supplied to \\`${componentName}\\`. Validation failed.`\n )\n },\n}\n","import React from \"react\"\nimport { Picture, PictureProps } from \"./picture\"\n\nexport type MainImageProps = PictureProps\n\nexport const MainImage: React.FC = function MainImage(props) {\n return (\n <>\n \n \n \n )\n}\n\nMainImage.displayName = `MainImage`\nMainImage.propTypes = Picture.propTypes\n","import React from \"react\"\nimport { getWrapperProps, getMainProps, getPlaceholderProps } from \"./hooks\"\nimport { Placeholder } from \"./placeholder\"\nimport { MainImage, MainImageProps } from \"./main-image\"\nimport { LayoutWrapper } from \"./layout-wrapper\"\nimport PropTypes from \"prop-types\"\nimport type { FunctionComponent, WeakValidationMap } from \"react\"\nimport type { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\n\nconst removeNewLines = (str: string): string => str.replace(/\\n/g, ``)\n\nexport const GatsbyImage: FunctionComponent =\n function GatsbyImage({\n as = `div`,\n className,\n class: preactClass,\n style,\n image,\n loading = `lazy`,\n imgClassName,\n imgStyle,\n backgroundColor,\n objectFit,\n objectPosition,\n ...props\n }) {\n if (!image) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n return null\n }\n\n if (preactClass) {\n className = preactClass\n }\n\n imgStyle = {\n objectFit,\n objectPosition,\n backgroundColor,\n ...imgStyle,\n }\n\n const {\n width,\n height,\n layout,\n images,\n placeholder,\n backgroundColor: placeholderBackgroundColor,\n } = image\n\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n\n const cleanedImages: IGatsbyImageData[\"images\"] = {\n fallback: undefined,\n sources: [],\n }\n if (images.fallback) {\n cleanedImages.fallback = {\n ...images.fallback,\n srcSet: images.fallback.srcSet\n ? removeNewLines(images.fallback.srcSet)\n : undefined,\n }\n }\n\n if (images.sources) {\n cleanedImages.sources = images.sources.map(source => {\n return {\n ...source,\n srcSet: removeNewLines(source.srcSet),\n }\n })\n }\n\n return React.createElement(\n as,\n {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n },\n \n \n\n )}\n // When eager is set we want to start the isLoading state on true (we want to load the img without react)\n {...getMainProps(\n loading === `eager`,\n false,\n cleanedImages,\n loading,\n imgStyle\n )}\n />\n \n )\n }\n\nexport const altValidator: PropTypes.Validator = (\n props: GatsbyImageProps,\n propName,\n componentName,\n ...rest\n): Error | undefined => {\n if (!props.alt && props.alt !== ``) {\n return new Error(\n `The \"alt\" prop is required in ${componentName}. If the image is purely presentational then pass an empty string: e.g. alt=\"\". Learn more: https://a11y-style-guide.com/style-guide/section-media.html`\n )\n }\n\n return PropTypes.string(props, propName, componentName, ...rest)\n}\n\nexport const propTypes = {\n image: PropTypes.object.isRequired,\n alt: altValidator,\n} as WeakValidationMap\n","import {\n createElement,\n memo,\n useMemo,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\"\nimport {\n getWrapperProps,\n gatsbyImageIsInstalled,\n hasNativeLazyLoadSupport,\n} from \"./hooks\"\nimport { getSizer } from \"./layout-wrapper\"\nimport { propTypes } from \"./gatsby-image.server\"\nimport type {\n FC,\n ElementType,\n FunctionComponent,\n ImgHTMLAttributes,\n CSSProperties,\n ReactEventHandler,\n} from \"react\"\nimport type { renderImageToString } from \"./lazy-hydrate\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { Layout } from \"../image-utils\"\n\nconst imageCache = new Set()\nlet renderImageToStringPromise\nlet renderImage: typeof renderImageToString | undefined\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface GatsbyImageProps\n extends Omit<\n ImgHTMLAttributes,\n \"placeholder\" | \"onLoad\" | \"src\" | \"srcSet\" | \"width\" | \"height\"\n > {\n alt: string\n as?: ElementType\n className?: string\n class?: string\n imgClassName?: string\n image: IGatsbyImageData\n imgStyle?: CSSProperties\n backgroundColor?: string\n objectFit?: CSSProperties[\"objectFit\"]\n objectPosition?: CSSProperties[\"objectPosition\"]\n onLoad?: (props: { wasCached: boolean }) => void\n onError?: ReactEventHandler\n onStartLoad?: (props: { wasCached: boolean }) => void\n}\n\nexport interface IGatsbyImageData {\n layout: Layout\n width: number\n height: number\n backgroundColor?: string\n images: Pick\n placeholder?: Pick\n}\n\nconst GatsbyImageHydrator: FC = function GatsbyImageHydrator({\n as = `div`,\n image,\n style,\n backgroundColor,\n className,\n class: preactClass,\n onStartLoad,\n onLoad,\n onError,\n ...props\n}) {\n const { width, height, layout } = image\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n const root = useRef()\n const cacheKey = useMemo(() => JSON.stringify(image.images), [image.images])\n\n // Preact uses class instead of className so we need to check for both\n if (preactClass) {\n className = preactClass\n }\n\n const sizer = getSizer(layout, width, height)\n\n useEffect(() => {\n if (!renderImageToStringPromise) {\n renderImageToStringPromise = import(`./lazy-hydrate`).then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n renderImage = renderImageToString\n\n return {\n renderImageToString,\n swapPlaceholderImage,\n }\n }\n )\n }\n\n // The plugin image component is a bit special where if it's server-side rendered, we add extra script tags to support lazy-loading without\n // In this case we stop hydration but fire the correct events.\n const ssrImage = root.current.querySelector(\n `[data-gatsby-image-ssr]`\n ) as HTMLImageElement\n if (ssrImage && hasNativeLazyLoadSupport()) {\n if (ssrImage.complete) {\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n } else {\n onStartLoad?.({\n wasCached: true,\n })\n\n ssrImage.addEventListener(`load`, function onLoadListener() {\n ssrImage.removeEventListener(`load`, onLoadListener)\n\n onLoad?.({\n wasCached: true,\n })\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n })\n }\n\n imageCache.add(cacheKey)\n\n return\n }\n\n if (renderImage && imageCache.has(cacheKey)) {\n return\n }\n\n let animationFrame\n let cleanupCallback\n renderImageToStringPromise.then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n if (!root.current) {\n return\n }\n\n root.current.innerHTML = renderImageToString({\n isLoading: true,\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n if (!imageCache.has(cacheKey)) {\n animationFrame = requestAnimationFrame(() => {\n if (root.current) {\n cleanupCallback = swapPlaceholderImage(\n root.current,\n cacheKey,\n imageCache,\n style,\n onStartLoad,\n onLoad,\n onError\n )\n }\n })\n }\n }\n )\n\n // eslint-disable-next-line consistent-return\n return (): void => {\n if (animationFrame) {\n cancelAnimationFrame(animationFrame)\n }\n if (cleanupCallback) {\n cleanupCallback()\n }\n }\n }, [image])\n\n // useLayoutEffect is ran before React commits to the DOM. This allows us to make sure our HTML is using our cached image version\n useLayoutEffect(() => {\n if (imageCache.has(cacheKey) && renderImage) {\n root.current.innerHTML = renderImage({\n isLoading: imageCache.has(cacheKey),\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n }\n }, [image])\n\n // By keeping all props equal React will keep the component in the DOM\n return createElement(as, {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n ref: root,\n dangerouslySetInnerHTML: {\n __html: sizer,\n },\n suppressHydrationWarning: true,\n })\n}\n\nexport const GatsbyImage: FunctionComponent = memo(\n function GatsbyImage(props) {\n if (!props.image) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n }\n\n return null\n }\n\n if (!gatsbyImageIsInstalled() && process.env.NODE_ENV === `development`) {\n console.warn(\n `[gatsby-plugin-image] You're missing out on some cool performance features. Please add \"gatsby-plugin-image\" to your gatsby-config.js`\n )\n }\n\n return createElement(GatsbyImageHydrator, props)\n }\n)\n\nGatsbyImage.propTypes = propTypes\nGatsbyImage.displayName = `GatsbyImage`\n","import React, { FunctionComponent, ReactElement } from \"react\"\nimport {\n altValidator,\n GatsbyImage as GatsbyImageServer,\n} from \"./gatsby-image.server\"\nimport { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\nimport PropTypes from \"prop-types\"\nimport { ISharpGatsbyImageArgs } from \"../image-utils\"\n\nexport interface IStaticImageProps\n extends Omit,\n Omit {\n src: string\n}\n\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nexport function _getStaticImage(\n GatsbyImage: FunctionComponent\n): React.FC {\n return function StaticImage({\n src,\n __imageData: imageData,\n __error,\n // We extract these because they're not meant to be passed-down to GatsbyImage\n /* eslint-disable @typescript-eslint/no-unused-vars */\n width,\n height,\n aspectRatio,\n tracedSVGOptions,\n placeholder,\n formats,\n quality,\n transformOptions,\n jpgOptions,\n pngOptions,\n webpOptions,\n avifOptions,\n blurredOptions,\n breakpoints,\n outputPixelDensities,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...props\n }): ReactElement {\n if (__error) {\n console.warn(__error)\n }\n\n if (imageData) {\n return \n }\n console.warn(`Image not loaded`, src)\n if (!__error && process.env.NODE_ENV === `development`) {\n console.warn(\n `Please ensure that \"gatsby-plugin-image\" is included in the plugins array in gatsby-config.js, and that your version of gatsby is at least 2.24.78`\n )\n }\n return null\n }\n}\n\nconst StaticImage: React.FC =\n _getStaticImage(GatsbyImageServer)\n\nconst checkDimensionProps: PropTypes.Validator = (\n props: IStaticImageProps & IPrivateProps,\n propName: keyof IStaticImageProps & IPrivateProps,\n ...rest\n) => {\n if (\n props.layout === `fullWidth` &&\n (propName === `width` || propName === `height`) &&\n props[propName]\n ) {\n return new Error(\n `\"${propName}\" ${props[propName]} may not be passed when layout is fullWidth.`\n )\n }\n return PropTypes.number(props, propName, ...rest)\n}\n\nconst validLayouts = new Set([`fixed`, `fullWidth`, `constrained`])\n\nexport const propTypes = {\n src: PropTypes.string.isRequired,\n alt: altValidator,\n width: checkDimensionProps,\n height: checkDimensionProps,\n sizes: PropTypes.string,\n layout: (props: IStaticImageProps & IPrivateProps): Error | undefined => {\n if (props.layout === undefined) {\n return undefined\n }\n if (validLayouts.has(props.layout)) {\n return undefined\n }\n\n return new Error(\n `Invalid value ${props.layout}\" provided for prop \"layout\". Defaulting to \"constrained\". Valid values are \"fixed\", \"fullWidth\" or \"constrained\".`\n )\n },\n}\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","import {\n GatsbyImage as GatsbyImageBrowser,\n IGatsbyImageData,\n} from \"./gatsby-image.browser\"\nimport React from \"react\"\nimport {\n _getStaticImage,\n propTypes,\n IStaticImageProps,\n} from \"./static-image.server\"\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nconst StaticImage: React.FC =\n _getStaticImage(GatsbyImageBrowser)\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","export default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAxOSAyMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjYzODUgMjEuODQwNkwxNy44NzI4IDExLjkxOTFDMTguNTYwNyAxMS40OTkzIDE4LjU2MDcgMTAuNTAxMyAxNy44NzI4IDEwLjA4MDRMMS42Mzg1IDAuMTYwMDUyQzAuOTIwNDQ1IC0wLjI3OTE3OCAwIDAuMjM3NTY0IDAgMS4wNzgzNFYyMC45MjEyQzAgMjEuNzYyIDAuOTIwNDQ1IDIyLjI3ODcgMS42Mzg1IDIxLjg0MDZaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K\"","import React, { forwardRef } from \"react\"\nimport tw, { styled } from \"twin.macro\"\nimport { GatsbyImage, getImage } from \"gatsby-plugin-image\"\n\nimport Video from \"images/icons/da-video.svg\"\nimport Pdf from \"images/icons/da-pdf.svg\"\nimport Tag from \"components/tag\"\nimport { daArticleTitle } from \"utils/demand-academy\"\n\nconst HeroImageSection = styled.div`\n ${tw`relative w-full h-auto`}\n\n aspect-ratio: 16 / 9;\n\n @media (min-width: 640px) {\n aspect-ratio: auto;\n height: 436px;\n }\n\n @media (min-width: 1200px) {\n ${tw`h-auto`}\n\n aspect-ratio: 16 / 9;\n }\n`\n\nconst BasicInfoStyles = styled.div`\n ${tw`w-full flex flex-col relative`}\n\n z-index: 4;\n\n @media (max-width: 1200px) {\n background: #f7f7f7;\n }\n\n .hero-action {\n ${tw`pointer-events-none`}\n\n &.enabled {\n ${tw`pointer-events-auto cursor-pointer`}\n }\n }\n\n .hero {\n ${tw`relative`}\n\n .circle {\n ${tw`rounded-full absolute`}\n\n background: #131313;\n width: 80px;\n height: 80px;\n left: calc(50% - 40px);\n top: calc(50% - 40px);\n\n img {\n ${tw`absolute`}\n }\n\n &.video {\n img {\n width: 35px;\n height: 39px;\n left: calc(50% - 13px);\n top: calc(50% - 20px);\n\n filter: drop-shadow(0px 0px 10px rgba(255, 255, 255, 0.7));\n }\n }\n\n &.pdf {\n img {\n width: 28px;\n height: 36px;\n left: calc(50% - 13px);\n top: calc(50% - 20px);\n\n filter: drop-shadow(0px 2.8px 14px rgba(255, 255, 255, 0.7))\n drop-shadow(0px 0px 7px rgba(0, 0, 0, 0.25));\n }\n }\n }\n }\n\n .meta {\n ${tw`flex flex-col l:flex-row items-start l:items-center mt-4 px-4 m:px-6 l:px-0`}\n\n .theme {\n ${tw`mt-2 l:mt-0 l:ml-3 font-display text-sm`}\n\n font-size: 13px;\n }\n }\n\n h3 {\n ${tw`mt-4 px-4 m:px-6 l:px-0 font-display text-2xl leading-tight`}\n\n color: #0C0C0C;\n\n @media (min-width: 768px) {\n font-size: 27px;\n }\n\n @media (min-width: 1200px) {\n font-size: 32px;\n }\n }\n`\n\nfunction BasicInfoComponent({ post, type, onClick, className = \"\" }, ref) {\n const { featuredImage, demandAcademyTier, demandAcademyTheme } = post\n\n const tierBoxShadow = demandAcademyTier.tertiaryColor?.hex\n ? `0px 2px 10px ${demandAcademyTier.tertiaryColor.hex}99`\n : \"\"\n\n const actionsEnabled = type === \"pdf\" || type === \"video\"\n\n const actions = {}\n\n if (actionsEnabled) {\n actions.onClick = handleClick\n }\n\n function handleClick(event) {\n if (event) {\n event.preventDefault()\n }\n\n onClick()\n }\n\n return (\n \n {featuredImage && (\n \n \n \n {actionsEnabled && (\n
\n \"\"\n
\n )}\n \n \n )}\n
\n \n {demandAcademyTier.name}\n \n \n {demandAcademyTheme}\n

\n
\n

{daArticleTitle(post)}

\n
\n )\n}\n\nconst BasicInfo = forwardRef(BasicInfoComponent)\n\nexport default BasicInfo\n","export default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAxMiAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjk0NTg1IDAuNjgzMDU4QzEuNzAxNzcgMC40Mzg5ODEgMS4zMDYwNCAwLjQzODk4MSAxLjA2MTk2IDAuNjgzMDU4QzAuODQwMDc2IDAuOTA0OTQ3IDAuODE5OTA0IDEuMjUyMTcgMS4wMDE0NSAxLjQ5Njg0TDEuMDYxOTYgMS41NjY5NEw5Ljk5NTM5IDEwLjQ5OTdMMS4wNjE5NiAxOS40MzMxQzAuODE3ODg3IDE5LjY3NzEgMC44MTc4ODcgMjAuMDcyOSAxLjA2MTk2IDIwLjMxNjlDMS4yODM4NSAyMC41Mzg4IDEuNjMxMDcgMjAuNTU5IDEuODc1NzUgMjAuMzc3NUwxLjk0NTg1IDIwLjMxNjlMMTAuODc4OSAxMS4zODM5QzExLjExMzUgMTEuMTQ5NiAxMS4yNDU0IDEwLjgzMTYgMTEuMjQ1NCAxMC41QzExLjI0NTQgMTAuMjA5OCAxMS4xNDQ0IDkuOTMwMSAxMC45NjIyIDkuNzA3OTRMMTAuODc5MiA5LjYxNjM5TDEuOTQ1ODUgMC42ODMwNThaIiBmaWxsPSIjRTMyODRDIi8+Cjwvc3ZnPgo=\"","import React from \"react\"\nimport { Link } from \"gatsby\"\nimport tw, { styled } from \"twin.macro\"\nimport { GatsbyImage, getImage } from \"gatsby-plugin-image\"\n\nimport Arrow from \"images/icons/da-arrow.svg\"\nimport { daArticlePath, daArticleTitle } from \"utils/demand-academy\"\n\nconst CardHeroImageSection = styled.div`\n ${tw`relative rounded-l`}\n\n &.mini-hero {\n ${tw`rounded-sm`}\n }\n`\n\nconst CardStyles = styled.div`\n ${tw`w-full rounded flex flex-row items-stretch justify-between`}\n\n background: rgba(0, 0, 0, 0.03);\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .hero {\n ${tw`hidden flex-shrink-0`}\n\n width: 199px;\n height: 113px;\n }\n\n .content {\n ${tw`py-3 l:py-4 flex flex-col ml-4 mr-5 l:mr-3 relative`}\n\n .title-wrapper {\n ${tw`mt-2 flex flex-row items-center`}\n\n .mini-hero {\n ${tw`hidden mr-3 w-1/3 flex-shrink-0`}\n\n width: 105px;\n height: 60px;\n }\n\n .title {\n ${tw`text-grey-5 font-display text-sm leading-normal`}\n }\n }\n\n .selected-bar {\n ${tw`absolute h-full left-0 top-0 w-1 -ml-4`}\n\n ${({ selectedBarColor }) => `\n background-color: ${selectedBarColor};\n box-shadow: 0px 2px 10px ${selectedBarColor}99;\n `}\n }\n }\n\n .arrow {\n ${tw`ml-4 l:ml-6 mr-4 l:mr-6 flex-shrink-0 hidden self-center`}\n\n img {\n width: 10px;\n height: 20px;\n filter: drop-shadow(0px 2px 10px rgba(227, 40, 76, 0.6));\n }\n }\n\n &.selected {\n .content {\n .title-wrapper {\n .title {\n ${tw`font-black`}\n }\n }\n }\n }\n\n &.next {\n @media (min-width: 800px) {\n ${tw`w-3/4`}\n }\n\n .hero {\n ${tw`l:block`}\n }\n\n .content {\n ${tw`mr-0 ml-3`}\n\n .title-wrapper {\n .mini-hero {\n ${tw`block l:hidden`}\n }\n }\n }\n\n .arrow {\n ${tw`block`}\n }\n }\n`\n\nexport default function IndexCard({\n post,\n next = false,\n selected = false,\n selectedRef,\n indexScroll,\n}) {\n const { featuredImage, tier, demandAcademyTheme } = post\n\n const linkState = {}\n\n if (!next) {\n linkState.indexScroll = indexScroll\n }\n\n return (\n \n \n \n \n \n
\n {selected &&
}\n \n {tier.name}\n
\n
{demandAcademyTheme}
\n
\n \n \n \n
{daArticleTitle(post)}
\n
\n
\n
\n \"\"\n
\n \n \n )\n}\n","import React from \"react\"\nimport tw, { styled } from \"twin.macro\"\nimport { AnimatePresence, motion } from \"framer-motion\"\n\nconst SectionsMenuStyles = styled.div`\n ${tw`l:hidden -mt-12 mb-8 sticky left-0 text-grey-5`}\n\n padding-top: 78px;\n // This can be uncommented to enable the transition between\n // main and sticky titles on mobile\n /* top: 50px; */\n top: -14px;\n\n @media (min-width: 640px) {\n // This can be uncommented to enable the transition between\n // main and sticky titles on mobile\n /* top: 82px; */\n top: 18px;\n }\n\n z-index: 3;\n background: #f7f7f7;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.04), 0px 2px 2px rgba(0, 0, 0, 0.04),\n 0px 4px 4px rgba(0, 0, 0, 0.04), 0px 8px 8px rgba(0, 0, 0, 0.04),\n 0px 16px 16px rgba(0, 0, 0, 0.04);\n\n .items {\n ${tw`flex flex-row items-center`}\n\n .item {\n ${tw`w-1/2 text-center pb-3 uppercase text-sm relative`}\n\n &.selected {\n ${tw`pointer-events-none font-extrabold`}\n }\n\n .selected-outline {\n ${tw`absolute w-full h-full border-b-2 border-b-neonred`}\n }\n }\n }\n`\n\nconst sectionMenuOpts = [\n {\n key: \"content\",\n title: \"Learning outcomes\",\n },\n {\n key: \"index\",\n title: \"Explore\",\n },\n]\n\nexport default function SectionsMenu({ section, setSection, title }) {\n function switchTo(sectionKey) {\n setSection(sectionKey)\n }\n\n return (\n \n \n {title && (\n \n

\n {title}\n

\n
\n \n )}\n
\n
\n {sectionMenuOpts.map(({ key, title }) => (\n switchTo(key)}\n >\n \n {section === key && (\n \n )}\n \n {title}\n
\n ))}\n
\n \n )\n}\n","import React, { useState, useRef, useEffect, useContext } from \"react\"\nimport tw, { styled } from \"twin.macro\"\nimport { useStaticQuery, graphql } from \"gatsby\"\nimport { useInView } from \"react-intersection-observer\"\nimport { useMediaQuery } from \"react-responsive\"\nimport { useLocation } from \"@reach/router\"\n\nimport Video from \"images/icons/da-video.svg\"\nimport Pdf from \"images/icons/da-pdf.svg\"\nimport Open from \"images/icons/da-open.svg\"\nimport ButtonLE from \"components/button-le\"\nimport Button from \"components/button\"\nimport Modal from \"components/modal\"\nimport YouTube from \"components/youtube.js\"\nimport { brandRules } from \"utils/brand-node\"\nimport { daArticleTitle } from \"utils/demand-academy\"\nimport { Main } from \"components/post\"\nimport StickyHeaderContext from \"context/sticky-header-context\"\nimport BasicInfo from \"components/demand-academy/basic-info\"\nimport IndexCard from \"components/demand-academy/index-card\"\nimport SectionsMenu from \"components/demand-academy/sections-menu\"\n\nconst Styles = styled.div`\n padding-top: 50px;\n\n @media (min-width: 640px) {\n padding-top: 80px;\n }\n\n @media (min-width: 1200px) {\n padding-top: 130px;\n }\n\n .main-wrapper {\n ${tw`bg-white`}\n\n .basic-info {\n ${tw`l:hidden opacity-100 visible`}\n\n &.hide {\n ${tw`opacity-0 invisible`}\n }\n }\n\n .main {\n ${tw`mx-auto l:max-w-l flex flex-col l:flex-row pb-32 l:pb-0 l:space-x-8`}\n\n @keyframes become-visible {\n 0% {\n display: none;\n opacity: 0;\n }\n 1% {\n display: block;\n opacity: 0;\n }\n 100% {\n display: block;\n opacity: 1;\n }\n }\n\n & > .content {\n ${tw`l:w-2/3 l:pt-10 px-4 m:px-6 l:px-0 hidden l:block relative`}\n\n @media (min-width: 1200px) {\n padding-bottom: 114px;\n }\n\n &.selected {\n @media (max-width: 1200px) {\n ${tw`block`}\n\n animation: become-visible 0.5s ease-out;\n }\n }\n\n .cta {\n ${tw`mt-12`}\n\n &.button {\n .button-content {\n ${tw`flex flex-row items-center justify-center`}\n\n img {\n ${tw`mr-3`}\n }\n\n &.video {\n img {\n width: 19px;\n height: 22px;\n }\n }\n\n &.pdf {\n img {\n width: 19px;\n height: 24px;\n }\n }\n }\n }\n\n .notice {\n ${tw`italic text-xs`}\n\n color: #878787;\n }\n }\n\n .explore-next {\n & > .title {\n ${tw`mb-3 text-sm font-bold uppercase`}\n\n color: #878787;\n }\n }\n }\n\n .index-wrapper {\n ${tw`l:w-1/3 hidden l:block px-4 m:px-6 l:px-0 l:sticky relative`}\n\n @media (min-width: 1200px) {\n top: 120px;\n left: 0px;\n height: calc(100vh - 160px);\n margin-bottom: 40px;\n }\n\n &.selected {\n @media (max-width: 1200px) {\n ${tw`block`}\n\n animation: become-visible 0.5s ease-out;\n }\n }\n\n &.sticky {\n @media (min-width: 1200px) {\n height: calc(100vh - 120px);\n }\n }\n\n .index {\n ${tw`flex flex-col l:h-full`}\n\n & > .title {\n ${tw`hidden l:block pt-10 mb-4 text-grey-5 text-sm uppercase font-bold`}\n }\n\n .scroll-wrapper {\n ${tw`h-full l:flex-grow l:flex-shrink l:relative l:overflow-hidden`}\n\n flex-basis: 0;\n\n .items {\n ${tw`space-y-1 l:overflow-y-auto l:h-full`}\n }\n\n .gradient {\n ${tw`absolute pointer-events-none w-full visible opacity-100`}\n\n height: 40px;\n left: 0px;\n transition: all 300ms;\n z-index: 1;\n\n &.top {\n ${tw`top-0`}\n\n background: linear-gradient(0deg, rgba(255, 255, 255, 0) 0%, #FFFFFF 100%);\n }\n\n &.bottom {\n ${tw`bottom-0`}\n\n background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #FFFFFF 100%);\n }\n\n &.hidden {\n ${tw`hidden opacity-0`}\n }\n\n @media (max-width: 1200px) {\n ${tw`hidden opacity-0`}\n }\n }\n }\n }\n }\n }\n\n .load-more {\n ${tw`py-4 rounded font-bold uppercase text-grey-35 w-full text-center cursor-pointer`}\n\n background: rgba(0, 0, 0, 0.05);\n\n &:hover {\n background: linear-gradient(\n 0deg,\n rgba(0, 0, 0, 0.05),\n rgba(0, 0, 0, 0.05)\n ),\n rgba(0, 0, 0, 0.05);\n }\n }\n }\n`\n\nfunction getType(post, intercomArticle) {\n const { files, externalUrl, youtubeId, body, wordpressId, legacyBody } = post\n\n if (intercomArticle?.body) {\n return \"intercomArticle\"\n } else if (youtubeId) {\n return \"video\"\n } else if (files.length > 0) {\n // Guaranteed to be a pdf file because of the query\n return \"pdf\"\n } else if (externalUrl) {\n return \"link\"\n } else if ((wordpressId && legacyBody) || body?.html) {\n return \"article\"\n } else {\n return \"unknown\"\n }\n}\n\nconst Content = styled.div`\n ${tw`font-body text-grey-10`}\n\n @media (max-width: 1200px) {\n ${tw`mx-auto`}\n\n max-width: 800px;\n }\n\n &.body-wrapper {\n ${tw`overflow-hidden relative`}\n\n .body {\n max-height: 300vh;\n\n &.show-all {\n ${tw`overflow-visible`}\n\n max-height: none;\n }\n\n &.has-more {\n ${tw`transition-all duration-1000 ease-out`}\n\n &::before {\n ${tw`absolute bottom-0 left-0 w-full`}\n\n content: \"\";\n height: 210px;\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0) 8.45%,\n #ffffff 100%\n );\n }\n }\n }\n }\n\n p,\n li {\n ${tw`mb-4`}\n }\n\n p.blurred {\n padding-top: 20px;\n color: transparent;\n text-shadow: 0 0 13px rgba(0, 0, 0, 0.5);\n user-select: none;\n }\n\n a {\n ${tw`text-dodgeblue`}\n &:hover {\n text-decoration: underline;\n }\n }\n\n ol {\n ${tw`pl-8 list-decimal`}\n }\n\n ul {\n ${tw`pl-8 list-disc`}\n }\n\n h1,\n h2,\n h3,\n h4,\n h5 {\n ${tw`text-grey-15`}\n display: block;\n margin-left: 0px;\n margin-right: 0px;\n }\n\n h1,\n h5 {\n margin-bottom: 32px;\n margin-top: 80px;\n }\n\n h2 {\n margin-bottom: 21px;\n margin-top: 60px;\n }\n\n h3 {\n margin-bottom: 10px;\n margin-top: 40px;\n }\n\n h4 {\n margin-bottom: 0px;\n margin-top: 0px;\n }\n\n b,\n strong {\n ${tw`font-display`}\n }\n\n img,\n img.size-full {\n width: 100%;\n }\n\n img[width] {\n width: auto;\n margin-left: unset;\n margin-right: unset;\n }\n\n .tags {\n ${tw`font-display font-bold text-grey-45`}\n font-size: 13px;\n letter-spacing: 0;\n line-height: 17px;\n text-transform: uppercase;\n white-space: normal;\n @media (min-width: 640px) {\n font-size: 19px;\n }\n\n .tags-label {\n height: 30px;\n display: inline-block;\n padding-right: 0.5rem;\n padding-top: 2px;\n vertical-align: bottom;\n }\n }\n\n .hr-above {\n ${tw`border-t border-grey-65 pt-12 mt-12`}\n }\n\n iframe {\n ${tw`max-w-full`}\n }\n`\n\nexport default function DemandAcademyPost({\n post,\n intercomArticle,\n indexScroll: prevIndexScroll,\n}) {\n const data = useStaticQuery(graphql`\n query DemandAcademyPost {\n gcms {\n demandAcademyTiers(orderBy: order_ASC) {\n id\n name\n color {\n css\n hex\n }\n secondaryColor {\n css\n hex\n }\n tertiaryColor {\n css\n hex\n }\n insightsArticles {\n id\n slug\n title\n demandAcademySlug\n demandAcademyTitle\n demandAcademyTheme\n featuredImage {\n altText\n url\n base64\n mimeType\n height\n width\n handle\n gatsbyImageData(width: 1200, placeholder: \"blurred\")\n }\n }\n }\n }\n }\n `)\n\n const [modal, setModal] = useState(false)\n const [section, setSection] = useState(\"content\")\n const [contentOffset, setContentOffset] = useState(0)\n const [hasMoreContent, setHasMoreContent] = useState(false)\n const [showAllContent, setShowAllContent] = useState(false)\n const [indexScroll, setIndexScroll] = useState(0)\n const [atTop, setAtTop] = useState(true)\n const [atBottom, setAtBottom] = useState(true)\n\n const location = useLocation()\n\n const indexRef = useRef()\n const selectedRef = useRef()\n const bodyRef = useRef()\n const pdfLinkRef = useRef()\n\n const [basicInfoRef, , entry] = useInView({\n threshold: [0, 0.2],\n })\n\n // This can be uncommented to enable the transition between\n // main and sticky titles on mobile\n // const showSecondaryTitle = entry?.intersectionRatio <= 0.2\n const showSecondaryTitle = false\n\n const isTablet = useMediaQuery({ minWidth: 640 })\n const isDesktop = useMediaQuery({ minWidth: 1200 })\n\n const { isStuck } = useContext(StickyHeaderContext)\n\n const { demandAcademyTiers: tiers } = data.gcms\n const {\n id,\n body,\n legacyBody,\n wordpressId,\n demandAcademySummary,\n externalUrl,\n youtubeId,\n files,\n } = post\n\n const type = getType(post, intercomArticle)\n\n const pdfUrl = files?.[0]?.url\n\n const articleBody =\n intercomArticle?.body || (wordpressId && legacyBody) || body?.html\n\n const postsIndex = buildPostsIndex(tiers)\n const nextPost = getNextPost(id, postsIndex)\n\n useEffect(() => {\n if (isDesktop) {\n if (prevIndexScroll !== undefined) {\n indexRef.current?.scrollTo({\n top: prevIndexScroll,\n })\n } else {\n scrollToCurrent()\n }\n }\n }, [])\n\n useEffect(() => {\n if (section === \"index\") {\n setContentOffset(window.scrollY)\n scrollToCurrent()\n } else {\n scrollToContent()\n }\n }, [section])\n\n useEffect(() => {\n if (bodyRef.current) {\n const { scrollHeight, clientHeight, parentElement } = bodyRef.current\n setHasMoreContent(\n scrollHeight > clientHeight || parentElement.clientHeight > clientHeight\n )\n }\n }, [])\n\n useEffect(() => {\n const { current } = indexRef\n\n current?.addEventListener(\"scroll\", handleIndexScroll)\n\n return () => current?.removeEventListener(\"scroll\", handleIndexScroll)\n }, [])\n\n useEffect(() => {\n // Auto open modal if #view or #play. Only open pdf on desktop because\n // mobile has some problems with the modal, video is ok for both device types.\n const openPdf = location?.hash === \"#view\" && type === \"pdf\" && isDesktop\n const playVideo = location?.hash === \"#play\" && type === \"video\"\n\n if (openPdf || playVideo) {\n setModal(true)\n }\n }, [location])\n\n function handleIndexScroll() {\n setIndexScroll(indexRef.current.scrollTop)\n\n const { scrollHeight, scrollTop, offsetHeight } = indexRef.current\n\n setAtTop(scrollTop === 0)\n setAtBottom(scrollHeight <= scrollTop + offsetHeight)\n }\n\n function doAction() {\n if (!isDesktop && type === \"pdf\") {\n // To avoid limitations when opening pdf files in an iframe on iOS\n pdfLinkRef.current?.click()\n } else {\n setModal(true)\n }\n }\n\n function buildPostsIndex(tiers) {\n return tiers.reduce((prev, tier) => {\n const tierPosts = tier.insightsArticles.map((post) => ({\n ...post,\n tier,\n }))\n\n return prev.concat(tierPosts)\n }, [])\n }\n\n function getNextPost(postId, postsIndex) {\n const currPostIndex = postsIndex.findIndex(({ id }) => id === postId)\n return postsIndex[currPostIndex + 1]\n }\n\n function scrollToCurrent() {\n const indexEl = indexRef.current\n const selectedEl = selectedRef.current\n if (indexEl && selectedEl) {\n if (isDesktop) {\n // This is for desktop, index scroll is overflown and is\n // the parent of the selected element\n indexEl.scrollTo({\n top: selectedEl.offsetTop,\n })\n } else if (section === \"index\") {\n const elemRect = selectedEl.getBoundingClientRect()\n // This can be uncommented to enable the transition between\n // main and sticky titles on mobile\n // let diff = 180\n let diff = 120\n if (isTablet) {\n diff += window.scrollY > 0 ? 35 : 20\n }\n // The parent of the selected element is the viewport\n window.scrollTo({\n top: window.scrollY + elemRect.top - diff,\n })\n }\n }\n }\n\n function scrollToContent() {\n window.scrollTo({\n top: contentOffset,\n })\n }\n\n function showAll() {\n setShowAllContent(true)\n setHasMoreContent(false)\n }\n\n return (\n \n {(type === \"video\" || type === \"pdf\") && modal && (\n setModal(false)}>\n
\n {type === \"video\" && (\n \n )}\n {type === \"pdf\" && (\n