import isNumber from 'is-number'; import $ from 'jquery'; import { throttle } from 'throttle-debounce'; const { ResizeObserver } = window; // Listen for slider width change to calculate dynamic height of images. const dynamicHeightObserver = new ResizeObserver( throttle(100, (entries) => { entries.forEach(({ target }) => { if (target && target.vpf) { const self = target.vpf; const calculatedHeight = (self.$item.width() * parseFloat(self.options.sliderItemsHeight)) / 100; target .querySelector('.vp-portfolio__items-wrap') .style.setProperty( '--vp-layout-slider--auto-items__height', `${calculatedHeight}px` ); } }); }) ); // Init Layout. $(document).on('initLayout.vpf', (event, self) => { if (event.namespace !== 'vpf') { return; } if (self.options.layout !== 'slider') { return; } ['items', 'thumbnails'].forEach((type) => { let itemsHeight = type === 'items' ? self.options.sliderItemsHeight : self.options.sliderThumbnailsHeight; if (itemsHeight === 'auto') { return; } const typeSingle = type.replace(/s$/g, ''); let itemsMinHeight = type === 'items' ? self.options.sliderItemsMinHeight : 0; itemsHeight = isNumber(itemsHeight) ? `${itemsHeight}px` : itemsHeight; // prevent minHeight option in preview, when used 'vh' units. if (itemsMinHeight && self.isPreview() && /vh/.test(itemsMinHeight)) { itemsMinHeight = 0; } const itemsPerView = type === 'items' ? self.options.sliderSlidesPerView : self.options.sliderThumbnailsPerView; if (itemsPerView === 'auto') { // fix fade slider items width. // https://github.com/nk-crew/visual-portfolio/issues/95. let itemsWidth = 'auto'; if (type === 'items' && self.options.sliderEffect === 'fade') { itemsWidth = '100%'; } // Calculate dynamic height. // Previously we tried the pure CSS solution, but there was couple bugs like: // - Classic styles items wrong height // - FireFox wrong images width render if (itemsHeight.indexOf('%') === itemsHeight.length - 1) { dynamicHeightObserver.observe(self.$item[0]); // Static height. } else { self.addStyle(`.vp-portfolio__${type}-wrap`, { '--vp-layout-slider--auto-items__height': itemsHeight, }); } self.addStyle(`.vp-portfolio__${typeSingle}-wrap`, { width: 'auto', }); self.addStyle( `.vp-portfolio__${typeSingle} .vp-portfolio__${typeSingle}-img img`, { width: itemsWidth, height: 'var(--vp-layout-slider--auto-items__height)', } ); // min height. if (itemsMinHeight) { self.addStyle( `.vp-portfolio__${typeSingle} .vp-portfolio__${typeSingle}-img img`, { 'min-height': itemsMinHeight, } ); } } else { // We have to use this hack with Before to support Dynamic height. // Also, previously we used the `margin-top`, // but it is not working correctly with Items Mininmal Height option. self.addStyle(`.vp-portfolio__${typeSingle}-img-wrap::before`, { 'padding-top': itemsHeight, }); self.addStyle(`.vp-portfolio__${typeSingle}-img img`, { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0, }); self.addStyle(`.vp-portfolio__${typeSingle}-img`, { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0, }); self.addStyle( `.vp-portfolio__${typeSingle} .vp-portfolio__${typeSingle}-img img`, { width: '100%', height: '100%', } ); // min height. if (itemsMinHeight) { self.addStyle(`.vp-portfolio__${typeSingle}-img-wrap::before`, { 'min-height': itemsMinHeight, }); } } }); // thumbnails top gap. if (self.options.sliderThumbnailsGap) { self.addStyle('.vp-portfolio__thumbnails-wrap', { 'margin-top': `${self.options.sliderThumbnailsGap}px`, }); } });