UNPKG

gatsby-background-image

Version:

Lazy-loading React background-image component with optional support for the blur-up effect.

150 lines (117 loc) 6.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.createStyleImage = exports.createPseudoStyles = exports.createPseudoElementWithContent = exports.createPseudoElementMediaQuery = exports.createPseudoElement = exports.createNoScriptStyles = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _StyleUtils = require("./StyleUtils"); var _ImageUtils = require("./ImageUtils"); var _MediaUtils = require("./MediaUtils"); var _SimpleUtils = require("./SimpleUtils"); var createPseudoElement = function createPseudoElement(className, appendix) { if (appendix === void 0) { appendix = ":before"; } var escapedClassName = (0, _StyleUtils.escapeClassNames)(className); var classes = (0, _SimpleUtils.stringToArray)(escapedClassName); var pseudoClasses = ""; if (Array.isArray(classes)) { classes = classes.filter(function (c) { return c !== ''; }); if (classes.length > 0) { pseudoClasses = "." + classes.join('.') + appendix; } } return pseudoClasses; }; exports.createPseudoElement = createPseudoElement; var createPseudoElementWithContent = function createPseudoElementWithContent(pseudoElementString, imageSource) { return "\n " + pseudoElementString + " {\n opacity: 1;\n background-image: " + imageSource + ";\n }"; }; exports.createPseudoElementWithContent = createPseudoElementWithContent; var createPseudoElementMediaQuery = function createPseudoElementMediaQuery(pseudoElementString, media, imageSource, imageSourceWebP) { return "\n @media " + media + " {\n " + createPseudoElementWithContent(pseudoElementString, imageSource) + "\n }\n " + (imageSourceWebP && "@media " + media + " {\n " + createPseudoElementWithContent(pseudoElementString, imageSourceWebP) + "\n }") + "\n "; }; exports.createPseudoElementMediaQuery = createPseudoElementMediaQuery; var createPseudoStyles = function createPseudoStyles(_ref) { var className = _ref.className, transitionDelay = _ref.transitionDelay, lastImage = _ref.lastImage, nextImage = _ref.nextImage, afterOpacity = _ref.afterOpacity, bgColor = _ref.bgColor, fadeIn = _ref.fadeIn, backgroundStyles = _ref.backgroundStyles, style = _ref.style, finalImage = _ref.finalImage, originalData = _ref.originalData; var pseudoBefore = createPseudoElement(className); var pseudoAfter = createPseudoElement(className, ":after"); var currentBackgroundStyles = (0, _extends2.default)({}, backgroundStyles, style); return "\n " + pseudoBefore + ",\n " + pseudoAfter + " {\n content: '';\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n " + (bgColor && "background-color: " + bgColor + ";") + "\n " + (0, _StyleUtils.setTransitionStyles)(transitionDelay, fadeIn) + "\n " + (0, _StyleUtils.kebabifyBackgroundStyles)(currentBackgroundStyles) + "\n }\n " + pseudoBefore + " {\n z-index: -100;\n " + ((!afterOpacity || finalImage) && createStyleImage(nextImage, originalData) || "") + "\n " + (afterOpacity && lastImage && createStyleImage(lastImage, originalData) || "") + "\n opacity: " + Number(!afterOpacity) + "; \n }\n " + pseudoAfter + " {\n z-index: -101;\n " + ((afterOpacity || finalImage) && createStyleImage(nextImage, originalData) || "") + "\n " + (!afterOpacity && lastImage && createStyleImage(lastImage, originalData) || "") + "\n " + (finalImage ? "opacity: " + Number(afterOpacity) + ";" : "") + "\n }\n "; }; exports.createPseudoStyles = createPseudoStyles; var createStyleImage = function createStyleImage(image, originalData) { var hasStackedImages = (0, _ImageUtils.hasImageArray)({ fluid: originalData }) && !(0, _MediaUtils.hasArtDirectionArray)({ fluid: originalData }); if ((0, _SimpleUtils.isBrowser)() || hasStackedImages) { return image ? "background-image: " + image + ";" : ""; } return ""; }; exports.createStyleImage = createStyleImage; var createNoScriptStyles = function createNoScriptStyles(_ref2) { var className = _ref2.className, image = _ref2.image; if (image) { var returnArray = Array.isArray(image) && !(0, _MediaUtils.hasArtDirectionArray)({ fluid: image }); var addUrl = false; var allSources = (0, _ImageUtils.getCurrentFromData)({ data: image, propName: "src", checkLoaded: false, addUrl: addUrl, returnArray: returnArray }); var sourcesAsUrl = (0, _ImageUtils.getUrlString)({ imageString: allSources, hasImageUrls: true, returnArray: returnArray }); var sourcesAsUrlWithCSS = ""; if (returnArray) { var cssStrings = (0, _ImageUtils.getCurrentFromData)({ data: image, propName: "CSS_STRING", addUrl: false, returnArray: returnArray }); sourcesAsUrlWithCSS = (0, _SimpleUtils.filteredJoin)((0, _SimpleUtils.combineArray)(sourcesAsUrl, cssStrings)); } var pseudoBefore = createPseudoElement(className); if ((0, _MediaUtils.hasArtDirectionArray)({ fluid: image })) { return image.map(function (currentMedia) { var sourceString = (0, _ImageUtils.getUrlString)({ imageString: currentMedia.src }); var webPString = (0, _ImageUtils.getUrlString)({ imageString: currentMedia.srcWebp || "" }); if (currentMedia.media) { return createPseudoElementMediaQuery(pseudoBefore, currentMedia.media, sourceString, webPString); } return createPseudoElementMediaQuery(pseudoBefore, 'screen', sourceString, webPString); }).join(''); } return createPseudoElementWithContent(pseudoBefore, sourcesAsUrlWithCSS || sourcesAsUrl); } return ""; }; exports.createNoScriptStyles = createNoScriptStyles;