{"version":3,"file":"fjGallery.entry.34a21bbf19ce33242e25.js","mappings":"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","sources":["webpack://ClientApi/webpack/bootstrap","webpack://ClientApi/./node_modules/flickr-justified-gallery/dist/fjGallery.esm.js","webpack://ClientApi/webpack/runtime/global","webpack://ClientApi/./src/js/fjGallery.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","/*!\n * Flickr's Justified Gallery [fjGallery] v2.1.2 (https://flickr-justified-gallery.nkdev.info)\n * Copyright 2022 nK \n * Licensed under MIT (https://github.com/nk-o/flickr-justified-gallery/blob/master/LICENSE)\n */\n/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\n/**\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher)\n * are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through,\n * as-is, to `callback` when the throttled-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.noTrailing] - Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds\n * while the throttled-function is being called. If noTrailing is false or unspecified, callback will be executed\n * one final time after the last throttled-function call. (After the throttled-function has not been called for\n * `delay` milliseconds, the internal counter is reset).\n * @param {boolean} [options.noLeading] - Optional, defaults to false. If noLeading is false, the first throttled-function call will execute callback\n * immediately. If noLeading is true, the first the callback execution will be skipped. It should be noted that\n * callback will never executed if both noLeading = true and noTrailing = true.\n * @param {boolean} [options.debounceMode] - If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is\n * false (at end), schedule `callback` to execute after `delay` ms.\n *\n * @returns {Function} A new, throttled, function.\n */\nfunction throttle(delay, callback, options) {\n var _ref = options || {},\n _ref$noTrailing = _ref.noTrailing,\n noTrailing = _ref$noTrailing === void 0 ? false : _ref$noTrailing,\n _ref$noLeading = _ref.noLeading,\n noLeading = _ref$noLeading === void 0 ? false : _ref$noLeading,\n _ref$debounceMode = _ref.debounceMode,\n debounceMode = _ref$debounceMode === void 0 ? undefined : _ref$debounceMode;\n /*\n * After wrapper has stopped being called, this timeout ensures that\n * `callback` is executed at the proper times in `throttle` and `end`\n * debounce modes.\n */\n\n\n var timeoutID;\n var cancelled = false; // Keep track of the last time `callback` was executed.\n\n var lastExec = 0; // Function to clear existing timeout\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID);\n }\n } // Function to cancel next exec\n\n\n function cancel(options) {\n var _ref2 = options || {},\n _ref2$upcomingOnly = _ref2.upcomingOnly,\n upcomingOnly = _ref2$upcomingOnly === void 0 ? false : _ref2$upcomingOnly;\n\n clearExistingTimeout();\n cancelled = !upcomingOnly;\n }\n /*\n * The `wrapper` function encapsulates all of the throttling / debouncing\n * functionality and when executed will limit the rate at which `callback`\n * is executed.\n */\n\n\n function wrapper() {\n for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) {\n arguments_[_key] = arguments[_key];\n }\n\n var self = this;\n var elapsed = Date.now() - lastExec;\n\n if (cancelled) {\n return;\n } // Execute `callback` and update the `lastExec` timestamp.\n\n\n function exec() {\n lastExec = Date.now();\n callback.apply(self, arguments_);\n }\n /*\n * If `debounceMode` is true (at begin) this is used to clear the flag\n * to allow future `callback` executions.\n */\n\n\n function clear() {\n timeoutID = undefined;\n }\n\n if (!noLeading && debounceMode && !timeoutID) {\n /*\n * Since `wrapper` is being called for the first time and\n * `debounceMode` is true (at begin), execute `callback`\n * and noLeading != true.\n */\n exec();\n }\n\n clearExistingTimeout();\n\n if (debounceMode === undefined && elapsed > delay) {\n if (noLeading) {\n /*\n * In throttle mode with noLeading, if `delay` time has\n * been exceeded, update `lastExec` and schedule `callback`\n * to execute after `delay` ms.\n */\n lastExec = Date.now();\n\n if (!noTrailing) {\n timeoutID = setTimeout(debounceMode ? clear : exec, delay);\n }\n } else {\n /*\n * In throttle mode without noLeading, if `delay` time has been exceeded, execute\n * `callback`.\n */\n exec();\n }\n } else if (noTrailing !== true) {\n /*\n * In trailing throttle mode, since `delay` time has not been\n * exceeded, schedule `callback` to execute `delay` ms after most\n * recent execution.\n *\n * If `debounceMode` is true (at begin), schedule `clear` to execute\n * after `delay` ms.\n *\n * If `debounceMode` is false (at end), schedule `callback` to\n * execute after `delay` ms.\n */\n timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);\n }\n }\n\n wrapper.cancel = cancel; // Return the wrapper function.\n\n return wrapper;\n}\n/* eslint-disable no-undefined */\n\n/**\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n *\n * @returns {Function} A new, debounced function.\n */\n\n\nfunction debounce(delay, callback, options) {\n var _ref = options || {},\n _ref$atBegin = _ref.atBegin,\n atBegin = _ref$atBegin === void 0 ? false : _ref$atBegin;\n\n return throttle(delay, callback, {\n debounceMode: atBegin !== false\n });\n}\n\nvar rafSchd = function rafSchd(fn) {\n var lastArgs = [];\n var frameId = null;\n\n var wrapperFn = function wrapperFn() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n lastArgs = args;\n\n if (frameId) {\n return;\n }\n\n frameId = requestAnimationFrame(function () {\n frameId = null;\n fn.apply(void 0, lastArgs);\n });\n };\n\n wrapperFn.cancel = function () {\n if (!frameId) {\n return;\n }\n\n cancelAnimationFrame(frameId);\n frameId = null;\n };\n\n return wrapperFn;\n};\n\nvar row = {exports: {}};\n\n/*!\n * Copyright 2019 SmugMug, Inc.\n * Licensed under the terms of the MIT license. Please see LICENSE file in the project root for terms.\n * @license\n */\n/**\n * Row\n * Wrapper for each row in a justified layout.\n * Stores relevant values and provides methods for calculating layout of individual rows.\n *\n * @param {Object} layoutConfig - The same as that passed\n * @param {Object} Initialization parameters. The following are all required:\n * @param params.top {Number} Top of row, relative to container\n * @param params.left {Number} Left side of row relative to container (equal to container left padding)\n * @param params.width {Number} Width of row, not including container padding\n * @param params.spacing {Number} Horizontal spacing between items\n * @param params.targetRowHeight {Number} Layout algorithm will aim for this row height\n * @param params.targetRowHeightTolerance {Number} Row heights may vary +/- (`targetRowHeight` x `targetRowHeightTolerance`)\n * @param params.edgeCaseMinRowHeight {Number} Absolute minimum row height for edge cases that cannot be resolved within tolerance.\n * @param params.edgeCaseMaxRowHeight {Number} Absolute maximum row height for edge cases that cannot be resolved within tolerance.\n * @param params.isBreakoutRow {Boolean} Is this row in particular one of those breakout rows? Always false if it's not that kind of photo list\n * @param params.widowLayoutStyle {String} If widows are visible, how should they be laid out?\n * @constructor\n */\n\nvar Row$1 = row.exports = function (params) {\n // Top of row, relative to container\n this.top = params.top; // Left side of row relative to container (equal to container left padding)\n\n this.left = params.left; // Width of row, not including container padding\n\n this.width = params.width; // Horizontal spacing between items\n\n this.spacing = params.spacing; // Row height calculation values\n\n this.targetRowHeight = params.targetRowHeight;\n this.targetRowHeightTolerance = params.targetRowHeightTolerance;\n this.minAspectRatio = this.width / params.targetRowHeight * (1 - params.targetRowHeightTolerance);\n this.maxAspectRatio = this.width / params.targetRowHeight * (1 + params.targetRowHeightTolerance); // Edge case row height minimum/maximum\n\n this.edgeCaseMinRowHeight = params.edgeCaseMinRowHeight;\n this.edgeCaseMaxRowHeight = params.edgeCaseMaxRowHeight; // Widow layout direction\n\n this.widowLayoutStyle = params.widowLayoutStyle; // Full width breakout rows\n\n this.isBreakoutRow = params.isBreakoutRow; // Store layout data for each item in row\n\n this.items = []; // Height remains at 0 until it's been calculated\n\n this.height = 0;\n};\n\nRow$1.prototype = {\n /**\n * Attempt to add a single item to the row.\n * This is the heart of the justified algorithm.\n * This method is direction-agnostic; it deals only with sizes, not positions.\n *\n * If the item fits in the row, without pushing row height beyond min/max tolerance,\n * the item is added and the method returns true.\n *\n * If the item leaves row height too high, there may be room to scale it down and add another item.\n * In this case, the item is added and the method returns true, but the row is incomplete.\n *\n * If the item leaves row height too short, there are too many items to fit within tolerance.\n * The method will either accept or reject the new item, favoring the resulting row height closest to within tolerance.\n * If the item is rejected, left/right padding will be required to fit the row height within tolerance;\n * if the item is accepted, top/bottom cropping will be required to fit the row height within tolerance.\n *\n * @method addItem\n * @param itemData {Object} Item layout data, containing item aspect ratio.\n * @return {Boolean} True if successfully added; false if rejected.\n */\n addItem: function (itemData) {\n var newItems = this.items.concat(itemData),\n // Calculate aspect ratios for items only; exclude spacing\n rowWidthWithoutSpacing = this.width - (newItems.length - 1) * this.spacing,\n newAspectRatio = newItems.reduce(function (sum, item) {\n return sum + item.aspectRatio;\n }, 0),\n targetAspectRatio = rowWidthWithoutSpacing / this.targetRowHeight,\n previousRowWidthWithoutSpacing,\n previousAspectRatio,\n previousTargetAspectRatio; // Handle big full-width breakout photos if we're doing them\n\n if (this.isBreakoutRow) {\n // Only do it if there's no other items in this row\n if (this.items.length === 0) {\n // Only go full width if this photo is a square or landscape\n if (itemData.aspectRatio >= 1) {\n // Close out the row with a full width photo\n this.items.push(itemData);\n this.completeLayout(rowWidthWithoutSpacing / itemData.aspectRatio, 'justify');\n return true;\n }\n }\n }\n\n if (newAspectRatio < this.minAspectRatio) {\n // New aspect ratio is too narrow / scaled row height is too tall.\n // Accept this item and leave row open for more items.\n this.items.push(Object.assign({}, itemData));\n return true;\n } else if (newAspectRatio > this.maxAspectRatio) {\n // New aspect ratio is too wide / scaled row height will be too short.\n // Accept item if the resulting aspect ratio is closer to target than it would be without the item.\n // NOTE: Any row that falls into this block will require cropping/padding on individual items.\n if (this.items.length === 0) {\n // When there are no existing items, force acceptance of the new item and complete the layout.\n // This is the pano special case.\n this.items.push(Object.assign({}, itemData));\n this.completeLayout(rowWidthWithoutSpacing / newAspectRatio, 'justify');\n return true;\n } // Calculate width/aspect ratio for row before adding new item\n\n\n previousRowWidthWithoutSpacing = this.width - (this.items.length - 1) * this.spacing;\n previousAspectRatio = this.items.reduce(function (sum, item) {\n return sum + item.aspectRatio;\n }, 0);\n previousTargetAspectRatio = previousRowWidthWithoutSpacing / this.targetRowHeight;\n\n if (Math.abs(newAspectRatio - targetAspectRatio) > Math.abs(previousAspectRatio - previousTargetAspectRatio)) {\n // Row with new item is us farther away from target than row without; complete layout and reject item.\n this.completeLayout(previousRowWidthWithoutSpacing / previousAspectRatio, 'justify');\n return false;\n } else {\n // Row with new item is us closer to target than row without;\n // accept the new item and complete the row layout.\n this.items.push(Object.assign({}, itemData));\n this.completeLayout(rowWidthWithoutSpacing / newAspectRatio, 'justify');\n return true;\n }\n } else {\n // New aspect ratio / scaled row height is within tolerance;\n // accept the new item and complete the row layout.\n this.items.push(Object.assign({}, itemData));\n this.completeLayout(rowWidthWithoutSpacing / newAspectRatio, 'justify');\n return true;\n }\n },\n\n /**\n * Check if a row has completed its layout.\n *\n * @method isLayoutComplete\n * @return {Boolean} True if complete; false if not.\n */\n isLayoutComplete: function () {\n return this.height > 0;\n },\n\n /**\n * Set row height and compute item geometry from that height.\n * Will justify items within the row unless instructed not to.\n *\n * @method completeLayout\n * @param newHeight {Number} Set row height to this value.\n * @param widowLayoutStyle {String} How should widows display? Supported: left | justify | center\n */\n completeLayout: function (newHeight, widowLayoutStyle) {\n var itemWidthSum = this.left,\n rowWidthWithoutSpacing = this.width - (this.items.length - 1) * this.spacing,\n clampedToNativeRatio,\n clampedHeight,\n errorWidthPerItem,\n roundedCumulativeErrors,\n singleItemGeometry,\n centerOffset; // Justify unless explicitly specified otherwise.\n\n if (typeof widowLayoutStyle === 'undefined' || ['justify', 'center', 'left'].indexOf(widowLayoutStyle) < 0) {\n widowLayoutStyle = 'left';\n } // Clamp row height to edge case minimum/maximum.\n\n\n clampedHeight = Math.max(this.edgeCaseMinRowHeight, Math.min(newHeight, this.edgeCaseMaxRowHeight));\n\n if (newHeight !== clampedHeight) {\n // If row height was clamped, the resulting row/item aspect ratio will be off,\n // so force it to fit the width (recalculate aspectRatio to match clamped height).\n // NOTE: this will result in cropping/padding commensurate to the amount of clamping.\n this.height = clampedHeight;\n clampedToNativeRatio = rowWidthWithoutSpacing / clampedHeight / (rowWidthWithoutSpacing / newHeight);\n } else {\n // If not clamped, leave ratio at 1.0.\n this.height = newHeight;\n clampedToNativeRatio = 1.0;\n } // Compute item geometry based on newHeight.\n\n\n this.items.forEach(function (item) {\n item.top = this.top;\n item.width = item.aspectRatio * this.height * clampedToNativeRatio;\n item.height = this.height; // Left-to-right.\n // TODO right to left\n // item.left = this.width - itemWidthSum - item.width;\n\n item.left = itemWidthSum; // Increment width.\n\n itemWidthSum += item.width + this.spacing;\n }, this); // If specified, ensure items fill row and distribute error\n // caused by rounding width and height across all items.\n\n if (widowLayoutStyle === 'justify') {\n itemWidthSum -= this.spacing + this.left;\n errorWidthPerItem = (itemWidthSum - this.width) / this.items.length;\n roundedCumulativeErrors = this.items.map(function (item, i) {\n return Math.round((i + 1) * errorWidthPerItem);\n });\n\n if (this.items.length === 1) {\n // For rows with only one item, adjust item width to fill row.\n singleItemGeometry = this.items[0];\n singleItemGeometry.width -= Math.round(errorWidthPerItem);\n } else {\n // For rows with multiple items, adjust item width and shift items to fill the row,\n // while maintaining equal spacing between items in the row.\n this.items.forEach(function (item, i) {\n if (i > 0) {\n item.left -= roundedCumulativeErrors[i - 1];\n item.width -= roundedCumulativeErrors[i] - roundedCumulativeErrors[i - 1];\n } else {\n item.width -= roundedCumulativeErrors[i];\n }\n });\n }\n } else if (widowLayoutStyle === 'center') {\n // Center widows\n centerOffset = (this.width - itemWidthSum) / 2;\n this.items.forEach(function (item) {\n item.left += centerOffset + this.spacing;\n }, this);\n }\n },\n\n /**\n * Force completion of row layout with current items.\n *\n * @method forceComplete\n * @param fitToWidth {Boolean} Stretch current items to fill the row width.\n * This will likely result in padding.\n * @param fitToWidth {Number}\n */\n forceComplete: function (fitToWidth, rowHeight) {\n // TODO Handle fitting to width\n // var rowWidthWithoutSpacing = this.width - (this.items.length - 1) * this.spacing,\n // \tcurrentAspectRatio = this.items.reduce(function (sum, item) {\n // \t\treturn sum + item.aspectRatio;\n // \t}, 0);\n if (typeof rowHeight === 'number') {\n this.completeLayout(rowHeight, this.widowLayoutStyle);\n } else {\n // Complete using target row height.\n this.completeLayout(this.targetRowHeight, this.widowLayoutStyle);\n }\n },\n\n /**\n * Return layout data for items within row.\n * Note: returns actual list, not a copy.\n *\n * @method getItems\n * @return Layout data for items within row.\n */\n getItems: function () {\n return this.items;\n }\n};\n\n/*!\n * Copyright 2019 SmugMug, Inc.\n * Licensed under the terms of the MIT license. Please see LICENSE file in the project root for terms.\n * @license\n */\n\nvar Row = row.exports;\n/**\n * Create a new, empty row.\n *\n * @method createNewRow\n * @param layoutConfig {Object} The layout configuration\n * @param layoutData {Object} The current state of the layout\n * @return A new, empty row of the type specified by this layout.\n */\n\nfunction createNewRow(layoutConfig, layoutData) {\n var isBreakoutRow; // Work out if this is a full width breakout row\n\n if (layoutConfig.fullWidthBreakoutRowCadence !== false) {\n if ((layoutData._rows.length + 1) % layoutConfig.fullWidthBreakoutRowCadence === 0) {\n isBreakoutRow = true;\n }\n }\n\n return new Row({\n top: layoutData._containerHeight,\n left: layoutConfig.containerPadding.left,\n width: layoutConfig.containerWidth - layoutConfig.containerPadding.left - layoutConfig.containerPadding.right,\n spacing: layoutConfig.boxSpacing.horizontal,\n targetRowHeight: layoutConfig.targetRowHeight,\n targetRowHeightTolerance: layoutConfig.targetRowHeightTolerance,\n edgeCaseMinRowHeight: 0.5 * layoutConfig.targetRowHeight,\n edgeCaseMaxRowHeight: 2 * layoutConfig.targetRowHeight,\n rightToLeft: false,\n isBreakoutRow: isBreakoutRow,\n widowLayoutStyle: layoutConfig.widowLayoutStyle\n });\n}\n/**\n * Add a completed row to the layout.\n * Note: the row must have already been completed.\n *\n * @method addRow\n * @param layoutConfig {Object} The layout configuration\n * @param layoutData {Object} The current state of the layout\n * @param row {Row} The row to add.\n * @return {Array} Each item added to the row.\n */\n\n\nfunction addRow(layoutConfig, layoutData, row) {\n layoutData._rows.push(row);\n\n layoutData._layoutItems = layoutData._layoutItems.concat(row.getItems()); // Increment the container height\n\n layoutData._containerHeight += row.height + layoutConfig.boxSpacing.vertical;\n return row.items;\n}\n/**\n * Calculate the current layout for all items in the list that require layout.\n * \"Layout\" means geometry: position within container and size\n *\n * @method computeLayout\n * @param layoutConfig {Object} The layout configuration\n * @param layoutData {Object} The current state of the layout\n * @param itemLayoutData {Array} Array of items to lay out, with data required to lay out each item\n * @return {Object} The newly-calculated layout, containing the new container height, and lists of layout items\n */\n\n\nfunction computeLayout(layoutConfig, layoutData, itemLayoutData) {\n var laidOutItems = [],\n itemAdded,\n currentRow,\n nextToLastRowHeight; // Apply forced aspect ratio if specified, and set a flag.\n\n if (layoutConfig.forceAspectRatio) {\n itemLayoutData.forEach(function (itemData) {\n itemData.forcedAspectRatio = true;\n itemData.aspectRatio = layoutConfig.forceAspectRatio;\n });\n } // Loop through the items\n\n\n itemLayoutData.some(function (itemData, i) {\n if (isNaN(itemData.aspectRatio)) {\n throw new Error(\"Item \" + i + \" has an invalid aspect ratio\");\n } // If not currently building up a row, make a new one.\n\n\n if (!currentRow) {\n currentRow = createNewRow(layoutConfig, layoutData);\n } // Attempt to add item to the current row.\n\n\n itemAdded = currentRow.addItem(itemData);\n\n if (currentRow.isLayoutComplete()) {\n // Row is filled; add it and start a new one\n laidOutItems = laidOutItems.concat(addRow(layoutConfig, layoutData, currentRow));\n\n if (layoutData._rows.length >= layoutConfig.maxNumRows) {\n currentRow = null;\n return true;\n }\n\n currentRow = createNewRow(layoutConfig, layoutData); // Item was rejected; add it to its own row\n\n if (!itemAdded) {\n itemAdded = currentRow.addItem(itemData);\n\n if (currentRow.isLayoutComplete()) {\n // If the rejected item fills a row on its own, add the row and start another new one\n laidOutItems = laidOutItems.concat(addRow(layoutConfig, layoutData, currentRow));\n\n if (layoutData._rows.length >= layoutConfig.maxNumRows) {\n currentRow = null;\n return true;\n }\n\n currentRow = createNewRow(layoutConfig, layoutData);\n }\n }\n }\n }); // Handle any leftover content (orphans) depending on where they lie\n // in this layout update, and in the total content set.\n\n if (currentRow && currentRow.getItems().length && layoutConfig.showWidows) {\n // Last page of all content or orphan suppression is suppressed; lay out orphans.\n if (layoutData._rows.length) {\n // Only Match previous row's height if it exists and it isn't a breakout row\n if (layoutData._rows[layoutData._rows.length - 1].isBreakoutRow) {\n nextToLastRowHeight = layoutData._rows[layoutData._rows.length - 1].targetRowHeight;\n } else {\n nextToLastRowHeight = layoutData._rows[layoutData._rows.length - 1].height;\n }\n\n currentRow.forceComplete(false, nextToLastRowHeight);\n } else {\n // ...else use target height if there is no other row height to reference.\n currentRow.forceComplete(false);\n }\n\n laidOutItems = laidOutItems.concat(addRow(layoutConfig, layoutData, currentRow));\n layoutConfig._widowCount = currentRow.getItems().length;\n } // We need to clean up the bottom container padding\n // First remove the height added for box spacing\n\n\n layoutData._containerHeight = layoutData._containerHeight - layoutConfig.boxSpacing.vertical; // Then add our bottom container padding\n\n layoutData._containerHeight = layoutData._containerHeight + layoutConfig.containerPadding.bottom;\n return {\n containerHeight: layoutData._containerHeight,\n widowCount: layoutConfig._widowCount,\n boxes: layoutData._layoutItems\n };\n}\n/**\n * Takes in a bunch of box data and config. Returns\n * geometry to lay them out in a justified view.\n *\n * @method covertSizesToAspectRatios\n * @param sizes {Array} Array of objects with widths and heights\n * @return {Array} A list of aspect ratios\n */\n\n\nvar lib = function (input, config) {\n var layoutConfig = {};\n var layoutData = {}; // Defaults\n\n var defaults = {\n containerWidth: 1060,\n containerPadding: 10,\n boxSpacing: 10,\n targetRowHeight: 320,\n targetRowHeightTolerance: 0.25,\n maxNumRows: Number.POSITIVE_INFINITY,\n forceAspectRatio: false,\n showWidows: true,\n fullWidthBreakoutRowCadence: false,\n widowLayoutStyle: 'left'\n };\n var containerPadding = {};\n var boxSpacing = {};\n config = config || {}; // Merge defaults and config passed in\n\n layoutConfig = Object.assign(defaults, config); // Sort out padding and spacing values\n\n containerPadding.top = !isNaN(parseFloat(layoutConfig.containerPadding.top)) ? layoutConfig.containerPadding.top : layoutConfig.containerPadding;\n containerPadding.right = !isNaN(parseFloat(layoutConfig.containerPadding.right)) ? layoutConfig.containerPadding.right : layoutConfig.containerPadding;\n containerPadding.bottom = !isNaN(parseFloat(layoutConfig.containerPadding.bottom)) ? layoutConfig.containerPadding.bottom : layoutConfig.containerPadding;\n containerPadding.left = !isNaN(parseFloat(layoutConfig.containerPadding.left)) ? layoutConfig.containerPadding.left : layoutConfig.containerPadding;\n boxSpacing.horizontal = !isNaN(parseFloat(layoutConfig.boxSpacing.horizontal)) ? layoutConfig.boxSpacing.horizontal : layoutConfig.boxSpacing;\n boxSpacing.vertical = !isNaN(parseFloat(layoutConfig.boxSpacing.vertical)) ? layoutConfig.boxSpacing.vertical : layoutConfig.boxSpacing;\n layoutConfig.containerPadding = containerPadding;\n layoutConfig.boxSpacing = boxSpacing; // Local\n\n layoutData._layoutItems = [];\n layoutData._awakeItems = [];\n layoutData._inViewportItems = [];\n layoutData._leadingOrphans = [];\n layoutData._trailingOrphans = [];\n layoutData._containerHeight = layoutConfig.containerPadding.top;\n layoutData._rows = [];\n layoutData._orphans = [];\n layoutConfig._widowCount = 0; // Convert widths and heights to aspect ratios if we need to\n\n return computeLayout(layoutConfig, layoutData, input.map(function (item) {\n if (item.width && item.height) {\n return {\n aspectRatio: item.width / item.height\n };\n } else {\n return {\n aspectRatio: item\n };\n }\n }));\n};\n\nfunction ready(callback) {\n if ('complete' === document.readyState || 'interactive' === document.readyState) {\n // Already ready or interactive, execute callback\n callback();\n } else {\n document.addEventListener('DOMContentLoaded', callback, {\n capture: true,\n once: true,\n passive: true\n });\n }\n}\n\n/* eslint-disable import/no-mutable-exports */\n\n/* eslint-disable no-restricted-globals */\nlet win;\n\nif ('undefined' !== typeof window) {\n win = window;\n} else if ('undefined' !== typeof global) {\n win = global;\n} else if ('undefined' !== typeof self) {\n win = self;\n} else {\n win = {};\n}\n\nvar global$1 = win;\n\n// get image dimensions\n// thanks https://gist.github.com/dimsemenov/5382856\nfunction getImgDimensions(img, cb) {\n let interval;\n let hasSize = false;\n let addedListeners = false;\n\n const onHasSize = () => {\n if (hasSize) {\n cb(hasSize);\n return;\n } // check for non-zero, non-undefined naturalWidth\n\n\n if (!img.naturalWidth) {\n return;\n }\n\n hasSize = {\n width: img.naturalWidth,\n height: img.naturalHeight\n };\n cb(hasSize);\n clearInterval(interval);\n\n if (addedListeners) {\n // eslint-disable-next-line no-use-before-define\n removeListeners();\n }\n };\n\n const onLoaded = () => {\n onHasSize();\n };\n\n const onError = () => {\n onHasSize();\n };\n\n const checkSize = () => {\n if (0 < img.naturalWidth) {\n onHasSize();\n }\n };\n\n const addListeners = () => {\n addedListeners = true;\n img.addEventListener('load', onLoaded);\n img.addEventListener('error', onError);\n };\n\n const removeListeners = () => {\n addedListeners = false;\n img.removeEventListener('load', onLoaded);\n img.removeEventListener('error', onError);\n };\n\n checkSize();\n\n if (!hasSize) {\n addListeners();\n interval = setInterval(checkSize, 100);\n }\n}\n\n// need to render all in one scroll/resize event\n\nconst fjGalleryList = [];\nconst updateFjGallery = /*#__PURE__*/rafSchd(() => {\n fjGalleryList.forEach(item => {\n item.resize();\n });\n});\nglobal$1.addEventListener('resize', updateFjGallery);\nglobal$1.addEventListener('orientationchange', updateFjGallery);\nglobal$1.addEventListener('load', updateFjGallery);\nready(() => {\n updateFjGallery();\n});\nlet instanceID = 0; // fjGallery class\n\nclass FJGallery {\n constructor(container, userOptions) {\n const self = this;\n self.instanceID = instanceID;\n instanceID += 1;\n self.$container = container;\n self.images = [];\n self.defaults = {\n itemSelector: '.fj-gallery-item',\n imageSelector: 'img',\n gutter: 10,\n // supports object like `{ horizontal: 10, vertical: 10 }`.\n rowHeight: 320,\n rowHeightTolerance: 0.25,\n // [0, 1]\n maxRowsCount: Number.POSITIVE_INFINITY,\n lastRow: 'left',\n // left, center, right, hide\n transitionDuration: '0.3s',\n calculateItemsHeight: false,\n resizeDebounce: 100,\n isRtl: 'rtl' === self.css(self.$container, 'direction'),\n // events\n onInit: null,\n // function() {}\n onDestroy: null,\n // function() {}\n onAppendImages: null,\n // function() {}\n onBeforeJustify: null,\n // function() {}\n onJustify: null // function() {}\n\n }; // prepare data-options\n\n const dataOptions = self.$container.dataset || {};\n const pureDataOptions = {};\n Object.keys(dataOptions).forEach(key => {\n const loweCaseOption = key.substr(0, 1).toLowerCase() + key.substr(1);\n\n if (loweCaseOption && 'undefined' !== typeof self.defaults[loweCaseOption]) {\n pureDataOptions[loweCaseOption] = dataOptions[key];\n }\n });\n self.options = { ...self.defaults,\n ...pureDataOptions,\n ...userOptions\n };\n self.pureOptions = { ...self.options\n }; // debounce for resize\n\n self.resize = debounce(self.options.resizeDebounce, self.resize);\n self.justify = rafSchd(self.justify.bind(self));\n self.init();\n } // add styles to element\n // eslint-disable-next-line class-methods-use-this\n\n\n css(el, styles) {\n if ('string' === typeof styles) {\n return global$1.getComputedStyle(el).getPropertyValue(styles);\n }\n\n Object.keys(styles).forEach(key => {\n el.style[key] = styles[key];\n });\n return el;\n } // set temporary transition with event listener\n\n\n applyTransition($item, properties) {\n const self = this; // Remove previous event listener\n\n self.onTransitionEnd($item)(); // Add transitions\n\n self.css($item, {\n 'transition-property': properties.join(', '),\n 'transition-duration': self.options.transitionDuration\n }); // Add event listener\n\n $item.addEventListener('transitionend', self.onTransitionEnd($item, properties), false);\n }\n\n onTransitionEnd($item) {\n const self = this;\n return () => {\n self.css($item, {\n 'transition-property': '',\n 'transition-duration': ''\n });\n $item.removeEventListener('transitionend', self.onTransitionEnd($item));\n };\n } // add to fjGallery instances list\n\n\n addToFjGalleryList() {\n fjGalleryList.push(this);\n updateFjGallery();\n } // remove from fjGallery instances list\n\n\n removeFromFjGalleryList() {\n const self = this;\n fjGalleryList.forEach((item, key) => {\n if (item.instanceID === self.instanceID) {\n fjGalleryList.splice(key, 1);\n }\n });\n }\n\n init() {\n const self = this;\n self.appendImages(self.$container.querySelectorAll(self.options.itemSelector));\n self.addToFjGalleryList(); // call onInit event\n\n if (self.options.onInit) {\n self.options.onInit.call(self);\n }\n } // append images\n\n\n appendImages($images) {\n const self = this; // check if jQuery\n\n if (global$1.jQuery && $images instanceof global$1.jQuery) {\n $images = $images.get();\n }\n\n if (!$images || !$images.length) {\n return;\n }\n\n $images.forEach($item => {\n // if $images is jQuery, for some reason in this array there is undefined item, that not a DOM,\n // so we need to check for $item.querySelector.\n if ($item && !$item.fjGalleryImage && $item.querySelector) {\n const $image = $item.querySelector(self.options.imageSelector);\n\n if ($image) {\n $item.fjGalleryImage = self;\n const data = {\n $item,\n $image,\n width: parseFloat($image.getAttribute('width')) || false,\n height: parseFloat($image.getAttribute('height')) || false,\n\n loadSizes() {\n const itemData = this;\n getImgDimensions($image, dimensions => {\n if (itemData.width !== dimensions.width || itemData.height !== dimensions.height) {\n itemData.width = dimensions.width;\n itemData.height = dimensions.height;\n self.resize();\n }\n });\n }\n\n };\n data.loadSizes();\n self.images.push(data);\n }\n }\n }); // call onAppendImages event\n\n if (self.options.onAppendImages) {\n self.options.onAppendImages.call(self, [$images]);\n }\n\n self.justify();\n } // justify images\n\n\n justify() {\n const self = this;\n const justifyArray = [];\n self.justifyCount = (self.justifyCount || 0) + 1; // call onBeforeJustify event\n\n if (self.options.onBeforeJustify) {\n self.options.onBeforeJustify.call(self);\n }\n\n self.images.forEach(data => {\n if (data.width && data.height) {\n justifyArray.push(data.width / data.height);\n }\n });\n const justifiedOptions = {\n containerWidth: self.$container.getBoundingClientRect().width,\n containerPadding: {\n top: parseFloat(self.css(self.$container, 'padding-top')) || 0,\n right: parseFloat(self.css(self.$container, 'padding-right')) || 0,\n bottom: parseFloat(self.css(self.$container, 'padding-bottom')) || 0,\n left: parseFloat(self.css(self.$container, 'padding-left')) || 0\n },\n boxSpacing: self.options.gutter,\n targetRowHeight: self.options.rowHeight,\n targetRowHeightTolerance: self.options.rowHeightTolerance,\n maxNumRows: self.options.maxRowsCount,\n showWidows: 'hide' !== self.options.lastRow\n };\n const justifiedData = lib(justifyArray, justifiedOptions); // Align last row\n\n if (justifiedData.widowCount && ('center' === self.options.lastRow || 'right' === self.options.lastRow)) {\n const lastItemData = justifiedData.boxes[justifiedData.boxes.length - 1];\n let gapSize = justifiedOptions.containerWidth - lastItemData.width - lastItemData.left;\n\n if ('center' === self.options.lastRow) {\n gapSize /= 2;\n }\n\n if ('right' === self.options.lastRow) {\n gapSize -= justifiedOptions.containerPadding.right;\n }\n\n for (let i = 1; i <= justifiedData.widowCount; i += 1) {\n justifiedData.boxes[justifiedData.boxes.length - i].left = justifiedData.boxes[justifiedData.boxes.length - i].left + gapSize;\n }\n } // RTL compatibility\n\n\n if (self.options.isRtl) {\n justifiedData.boxes.forEach((boxData, i) => {\n justifiedData.boxes[i].left = justifiedOptions.containerWidth - justifiedData.boxes[i].left - justifiedData.boxes[i].width - justifiedOptions.containerPadding.right + justifiedOptions.containerPadding.left;\n });\n }\n\n let i = 0;\n let additionalTopOffset = 0;\n const rowsMaxHeight = {}; // Set image sizes.\n\n self.images.forEach((data, imgI) => {\n if (justifiedData.boxes[i] && data.width && data.height) {\n // calculate additional offset based on actual items height.\n if (self.options.calculateItemsHeight && 'undefined' === typeof rowsMaxHeight[justifiedData.boxes[i].top] && Object.keys(rowsMaxHeight).length) {\n additionalTopOffset += rowsMaxHeight[Object.keys(rowsMaxHeight).pop()] - justifiedData.boxes[imgI - 1].height;\n }\n\n if (self.options.transitionDuration && 1 < self.justifyCount) {\n self.applyTransition(data.$item, ['transform']);\n }\n\n self.css(data.$item, {\n display: '',\n position: 'absolute',\n transform: `translateX(${justifiedData.boxes[i].left}px) translateY(${justifiedData.boxes[i].top + additionalTopOffset}px) translateZ(0)`,\n width: `${justifiedData.boxes[i].width}px`\n }); // calculate actual items height.\n\n if (self.options.calculateItemsHeight) {\n const rect = data.$item.getBoundingClientRect();\n\n if ('undefined' === typeof rowsMaxHeight[justifiedData.boxes[i].top] || rowsMaxHeight[justifiedData.boxes[i].top] < rect.height) {\n rowsMaxHeight[justifiedData.boxes[i].top] = rect.height;\n }\n }\n\n i += 1;\n } else {\n self.css(data.$item, {\n display: 'none'\n });\n }\n }); // increase additional offset based on the latest row items height.\n\n if (self.options.calculateItemsHeight && Object.keys(rowsMaxHeight).length) {\n additionalTopOffset += rowsMaxHeight[Object.keys(rowsMaxHeight).pop()] - justifiedData.boxes[justifiedData.boxes.length - 1].height;\n }\n\n if (self.options.transitionDuration) {\n self.applyTransition(self.$container, ['height']);\n } // Set container height.\n\n\n self.css(self.$container, {\n height: `${justifiedData.containerHeight + additionalTopOffset}px`\n }); // call onJustify event\n\n if (self.options.onJustify) {\n self.options.onJustify.call(self);\n }\n } // update options and resize gallery items\n\n\n updateOptions(options) {\n const self = this;\n self.options = { ...self.options,\n ...options\n };\n self.justify();\n }\n\n destroy() {\n const self = this;\n self.removeFromFjGalleryList();\n self.justifyCount = 0; // call onDestroy event\n\n if (self.options.onDestroy) {\n self.options.onDestroy.call(self);\n } // remove styles.\n\n\n self.css(self.$container, {\n height: '',\n transition: ''\n });\n self.images.forEach(data => {\n self.css(data.$item, {\n position: '',\n transform: '',\n transition: '',\n width: '',\n height: ''\n });\n }); // delete fjGalleryImage instance from images\n\n self.images.forEach(val => {\n delete val.$item.fjGalleryImage;\n }); // delete fjGallery instance from container\n\n delete self.$container.fjGallery;\n }\n\n resize() {\n const self = this;\n self.justify();\n }\n\n} // global definition\n\n\nconst fjGallery = function (items, options, ...args) {\n // check for dom element\n // thanks: http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object\n if ('object' === typeof HTMLElement ? items instanceof HTMLElement : items && 'object' === typeof items && null !== items && 1 === items.nodeType && 'string' === typeof items.nodeName) {\n items = [items];\n }\n\n const len = items.length;\n let k = 0;\n let ret;\n\n for (k; k < len; k += 1) {\n if ('object' === typeof options || 'undefined' === typeof options) {\n if (!items[k].fjGallery) {\n // eslint-disable-next-line new-cap\n items[k].fjGallery = new FJGallery(items[k], options);\n }\n } else if (items[k].fjGallery) {\n // eslint-disable-next-line prefer-spread\n ret = items[k].fjGallery[options].apply(items[k].fjGallery, args);\n }\n\n if ('undefined' !== typeof ret) {\n return ret;\n }\n }\n\n return items;\n};\n\nfjGallery.constructor = FJGallery;\n\nexport { fjGallery as default };\n//# sourceMappingURL=fjGallery.esm.js.map\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","import fjGallery from \"flickr-justified-gallery\";\n\nfjGallery(document.querySelectorAll('.fj-gallery'), {\n itemSelector: '.fj-gallery-item'\n });\n\nimport '../sass/components/_albums.scss';"],"names":["__webpack_require__","debounce","delay","callback","options","_ref$atBegin","atBegin","timeoutID","_ref","_ref$noTrailing","noTrailing","_ref$noLeading","noLeading","_ref$debounceMode","debounceMode","undefined","cancelled","lastExec","clearExistingTimeout","clearTimeout","wrapper","_len","arguments","length","arguments_","Array","_key","self","this","elapsed","Date","now","exec","apply","clear","setTimeout","cancel","_ref2$upcomingOnly","upcomingOnly","throttle","g","globalThis","Function","e","window","rafSchd","fn","lastArgs","frameId","wrapperFn","args","requestAnimationFrame","cancelAnimationFrame","row","exports","params","top","left","width","spacing","targetRowHeight","targetRowHeightTolerance","minAspectRatio","maxAspectRatio","edgeCaseMinRowHeight","edgeCaseMaxRowHeight","widowLayoutStyle","isBreakoutRow","items","height","prototype","addItem","itemData","previousRowWidthWithoutSpacing","previousAspectRatio","previousTargetAspectRatio","newItems","concat","rowWidthWithoutSpacing","newAspectRatio","reduce","sum","item","aspectRatio","targetAspectRatio","push","completeLayout","Object","assign","Math","abs","isLayoutComplete","newHeight","clampedToNativeRatio","clampedHeight","errorWidthPerItem","roundedCumulativeErrors","centerOffset","itemWidthSum","indexOf","max","min","forEach","map","i","round","forceComplete","fitToWidth","rowHeight","getItems","Row","createNewRow","layoutConfig","layoutData","fullWidthBreakoutRowCadence","_rows","_containerHeight","containerPadding","containerWidth","right","boxSpacing","horizontal","rightToLeft","addRow","_layoutItems","vertical","lib","input","config","defaults","maxNumRows","Number","POSITIVE_INFINITY","forceAspectRatio","showWidows","isNaN","parseFloat","bottom","_awakeItems","_inViewportItems","_leadingOrphans","_trailingOrphans","_orphans","_widowCount","itemLayoutData","itemAdded","currentRow","nextToLastRowHeight","laidOutItems","forcedAspectRatio","some","Error","containerHeight","widowCount","boxes","computeLayout","win","global$1","getImgDimensions","img","cb","interval","hasSize","addedListeners","onHasSize","naturalWidth","naturalHeight","clearInterval","removeListeners","onLoaded","onError","checkSize","removeEventListener","addEventListener","setInterval","fjGalleryList","updateFjGallery","resize","document","readyState","capture","once","passive","instanceID","FJGallery","constructor","container","userOptions","$container","images","itemSelector","imageSelector","gutter","rowHeightTolerance","maxRowsCount","lastRow","transitionDuration","calculateItemsHeight","resizeDebounce","isRtl","css","onInit","onDestroy","onAppendImages","onBeforeJustify","onJustify","dataOptions","dataset","pureDataOptions","keys","key","loweCaseOption","substr","toLowerCase","pureOptions","justify","bind","init","el","styles","getComputedStyle","getPropertyValue","style","applyTransition","$item","properties","onTransitionEnd","join","addToFjGalleryList","removeFromFjGalleryList","splice","appendImages","querySelectorAll","call","$images","jQuery","get","fjGalleryImage","querySelector","$image","data","getAttribute","loadSizes","dimensions","justifyArray","justifyCount","justifiedOptions","getBoundingClientRect","justifiedData","lastItemData","gapSize","boxData","additionalTopOffset","rowsMaxHeight","imgI","pop","display","position","transform","rect","updateOptions","destroy","transition","val","fjGallery","HTMLElement","nodeType","nodeName","len","ret","k"],"sourceRoot":""}