import $ from 'jquery'; const { screenSizes } = window.VPData; // // Our custom Grid layout for Isotope. // // * fixes grid items position in FireFox - https://wordpress.org/support/topic/gallery-difference-between-firefox-and-all-other-browsers/ // if ( typeof window.Isotope !== 'undefined' && typeof window.Isotope.LayoutMode !== 'undefined' ) { const VPRows = window.Isotope.LayoutMode.create('vpRows'); const proto = VPRows.prototype; proto.measureColumns = function () { // set items, used if measuring first item this.items = this.isotope.filteredItems; this.getContainerWidth(); // if columnWidth is 0, default to outerWidth of first item if (!this.columnWidth) { const firstItem = this.items[0]; const firstItemElem = firstItem && firstItem.element; // columnWidth fall back to item of first element this.columnWidth = (firstItemElem && window.getSize(firstItemElem).outerWidth) || // if first elem has no width, default to size of container this.containerWidth; } this.columnWidth += this.gutter; // calculate columns const containerWidth = this.containerWidth + this.gutter; let cols = containerWidth / this.columnWidth; // fix rounding errors, typically with gutters const excess = this.columnWidth - (containerWidth % this.columnWidth); // if overshoot is less than a pixel, round up, otherwise floor it const mathMethod = excess && excess < 1 ? 'round' : 'floor'; cols = Math[mathMethod](cols); this.cols = Math.max(cols, 1); }; proto.getContainerWidth = function () { // container is parent if fit width const isFitWidth = this._getOption ? this._getOption('fitWidth') : false; const container = isFitWidth ? this.element.parentNode : this.element; // check that this.size and size are there // IE8 triggers resize on body size change, so they might not be const size = window.getSize(container); this.containerWidth = size && size.innerWidth; }; proto._resetLayout = function () { this.x = 0; this.y = 0; this.maxY = 0; this.horizontalColIndex = 0; this._getMeasurement('columnWidth', 'outerWidth'); this._getMeasurement('gutter', 'outerWidth'); this.measureColumns(); }; proto._getItemLayoutPosition = function (item) { item.getSize(); // how many columns does this brick span const remainder = item.size.outerWidth % this.columnWidth; const mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; // round if off by 1 pixel, otherwise use ceil let colSpan = Math[mathMethod](item.size.outerWidth / this.columnWidth); colSpan = Math.min(colSpan, this.cols); let col = this.horizontalColIndex % this.cols; const isOver = colSpan > 1 && col + colSpan > this.cols; // shift to next row if item can't fit on current row col = isOver ? 0 : col; // don't let zero-size items take up space const hasSize = item.size.outerWidth && item.size.outerHeight; this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; const itemWidth = item.size.outerWidth + this.gutter; // if this element cannot fit in the current row if (this.x !== 0 && this.horizontalColIndex === 1) { this.x = 0; this.y = this.maxY; } const position = { x: this.x, y: this.y, }; this.maxY = Math.max(this.maxY, this.y + item.size.outerHeight); this.x += itemWidth; return position; }; proto._getContainerSize = function () { return { height: this.maxY }; }; } // Init Options. $(document).on('initOptions.vpf', (event, self) => { if (event.namespace !== 'vpf') { return; } self.defaults.gridColumns = 3; if (!self.options.gridColumns) { self.options.gridColumns = self.defaults.gridColumns; } if (!self.options.gridImagesAspectRatio) { self.options.gridImagesAspectRatio = self.defaults.gridImagesAspectRatio; } }); // Init Layout. $(document).on('initLayout.vpf', (event, self) => { if (event.namespace !== 'vpf') { return; } if (self.options.layout !== 'grid') { return; } // columns. self.addStyle('.vp-portfolio__item-wrap', { width: `${100 / self.options.gridColumns}%`, }); // calculate responsive. let count = self.options.gridColumns - 1; let currentPoint = Math.min(screenSizes.length - 1, count); for (; currentPoint >= 0; currentPoint -= 1) { if (count > 0 && typeof screenSizes[currentPoint] !== 'undefined') { self.addStyle( '.vp-portfolio__item-wrap', { width: `${100 / count}%`, }, `screen and (max-width: ${screenSizes[currentPoint]}px)` ); } count -= 1; } }); // Change Isotope Layout Mode. $(document).on('beforeInitIsotope.vpf', (event, self, initOptions) => { if (event.namespace !== 'vpf') { return; } if (self.options.layout !== 'grid' || typeof initOptions !== 'object') { return; } initOptions.layoutMode = 'vpRows'; });