rfx-parallax
Advanced tools
Comparing version 2.2.2 to 2.2.3
@@ -12,3 +12,3 @@ (function (global, factory) { | ||
var RfxParallaxBoundariesModel = /** @class */ (function () { | ||
function RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels) { | ||
function RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels, unusablePixels) { | ||
this.startPoint = startPoint; | ||
@@ -18,2 +18,3 @@ this.endPoint = endPoint; | ||
this.usablePixels = usablePixels; | ||
this.unusablePixels = unusablePixels; | ||
} | ||
@@ -491,5 +492,5 @@ return RfxParallaxBoundariesModel; | ||
this.image.setAttribute('class', 'parallax-image'); | ||
this.setStaticProperties(this.htmlElement.nativeElement, this.image); | ||
this.renderer.setStyle(this.image, 'visiblity', 'hidden'); | ||
this.htmlElement.nativeElement.appendChild(this.image); | ||
this.setStaticProperties(this.htmlElement.nativeElement, this.image); | ||
this.image.onload = function () { | ||
@@ -511,3 +512,3 @@ var imagePosition = _this.setParallaxPosition(_this.htmlElement.nativeElement, _this.image); | ||
var elementTop = container.getBoundingClientRect().top + this.scrollTop; | ||
this.parallaxBoundaries = this.getParallaxBoundaries(elementTop, container.clientHeight, this.parallaxPercentage); | ||
this.parallaxBoundaries = this.getParallaxBoundaries(elementTop, container.clientHeight, this.image.height, this.parallaxPercentage); | ||
var imageLeft = this.getImageLeft(container.clientWidth, image.width, this.positionPercentage); | ||
@@ -564,10 +565,12 @@ var imageTop = this.getImageTop(this.scrollTop, this.parallaxBoundaries); | ||
* @param elementHeight main container height in pixels | ||
* @param imageHeight parallax image height in pixels | ||
* @param parallaxPercentage parallax scroll percentage | ||
*/ | ||
RfxParallaxDirective.prototype.getParallaxBoundaries = function (elementTop, elementHeight, parallaxPercentage) { | ||
RfxParallaxDirective.prototype.getParallaxBoundaries = function (elementTop, elementHeight, imageHeight, parallaxPercentage) { | ||
var usablePixels = elementHeight / 100 * parallaxPercentage; | ||
var unusablePixels = imageHeight - elementHeight - usablePixels; | ||
var startPoint = elementTop - usablePixels - window.innerHeight; | ||
var endPoint = elementTop + elementHeight + usablePixels; | ||
var totalPixels = endPoint - startPoint; | ||
return new RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels); | ||
return new RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels, unusablePixels); | ||
}; | ||
@@ -600,3 +603,3 @@ /** | ||
var parallaxAreaPercentage = 100 / boundaries.totalPixels * parallaxArea; | ||
return -boundaries.usablePixels * (1 - parallaxAreaPercentage / 100); | ||
return -boundaries.usablePixels * (1 - parallaxAreaPercentage / 100) - boundaries.unusablePixels / 2; | ||
}; | ||
@@ -603,0 +606,0 @@ return RfxParallaxDirective; |
@@ -1,2 +0,2 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("rxjs"),require("resize-observer-polyfill")):"function"==typeof define&&define.amd?define("rfx-parallax",["exports","@angular/core","rxjs","resize-observer-polyfill"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["rfx-parallax"]={},e.ng.core,e.rxjs,e["resize-observer-polyfill"])}(this,(function(e,t,i,r){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=n(r),s=function(e,t,i,r){this.startPoint=e,this.endPoint=t,this.totalPixels=i,this.usablePixels=r},a=function(e,t){this.left=e,this.top=t};Object.create;function l(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],r=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}Object.create;var h=function(){function e(e){this.rendererFactory=e,this.subjectScroll=new i.BehaviorSubject(void 0),this.subjectResize=new i.BehaviorSubject(void 0),this.renderer=this.rendererFactory.createRenderer(null,null)}return e.prototype.ngOnDestroy=function(){this.elementScrollEvent&&this.elementScrollEvent(),this.windowResizeEvent&&this.windowResizeEvent(),this.elementHeightEvent&&this.elementHeightEvent.disconnect()},e.prototype.initListeners=function(e){var t=this;this.elementScrollEvent=this.renderer.listen(null!=e?e:window,"scroll",(function(e){return t.onMouseScroll(e)})),this.windowResizeEvent=this.renderer.listen(window,"resize",(function(e){return t.onWindowResize(e)})),e&&this.setElementResizeEvent(e)},e.prototype.setElementResizeEvent=function(e){var t,i,r=this;this.elementHeightEvent=new o.default((function(){return r.onWindowResize({target:{innerWidth:e.clientWidth}})}));var n=Array.from(e.children);try{for(var s=l(n),a=s.next();!a.done;a=s.next()){var h=a.value;this.elementHeightEvent.observe(h)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(t)throw t.error}}},e.prototype.onMouseScroll=function(e){var t;this.subjectScroll.next(null!==(t=e.target.scrollTop)&&void 0!==t?t:e.target.documentElement.scrollTop)},e.prototype.getMouseScroll=function(){return this.subjectScroll.asObservable()},e.prototype.onWindowResize=function(e){this.subjectResize.next(e.target.innerWidth)},e.prototype.getWindowResize=function(){return this.subjectResize.asObservable()},e}();h.ɵprov=t.ɵɵdefineInjectable({factory:function(){return new h(t.ɵɵinject(t.RendererFactory2))},token:h,providedIn:"root"}),h.decorators=[{type:t.Injectable,args:[{providedIn:"root"}]}],h.ctorParameters=function(){return[{type:t.RendererFactory2}]};var u=function(){function e(e,t,i){this.htmlElement=e,this.renderer=t,this.rfxParallaxService=i,this.parallaxPercentage=40,this.positionPercentage=50,this.imageZIndex=-1,this.isDisabled=!1,this.visibleOverflow=!1,this.scrollTop=0,this.imageLeft=0}return e.prototype.ngOnInit=function(){this.setListeners()},e.prototype.ngOnDestroy=function(){this.onScrollListener&&this.onScrollListener.unsubscribe(),this.onResizeListener&&this.onResizeListener.unsubscribe()},e.prototype.ngOnChanges=function(e){var t;(null===(t=e.imageUrl)||void 0===t?void 0:t.currentValue)&&this.loadImage(e.imageUrl.currentValue)},e.prototype.setListeners=function(){var e=this;this.onScrollListener=this.rfxParallaxService.getMouseScroll().subscribe((function(t){return e.onMouseScroll(t)})),this.onResizeListener=this.rfxParallaxService.getWindowResize().subscribe((function(t){return e.onWindowResize(t)}))},e.prototype.onMouseScroll=function(e){if(this.scrollTop=null!=e?e:0,this.imageLoaded){var t=this.getImageTop(e,this.parallaxBoundaries);this.setImageTransform(this.image,this.imageLeft,t)}},e.prototype.onWindowResize=function(e){if(void 0!==e&&this.imageLoaded){var t=this.setParallaxPosition(this.htmlElement.nativeElement,this.image);this.imageLeft=t.left,this.setImageTransform(this.image,t.left,t.top)}},e.prototype.loadImage=function(e){var t=this;this.image=new Image,this.image.src=e,this.image.setAttribute("class","parallax-image"),this.setStaticProperties(this.htmlElement.nativeElement,this.image),this.renderer.setStyle(this.image,"visiblity","hidden"),this.htmlElement.nativeElement.appendChild(this.image),this.image.onload=function(){var e=t.setParallaxPosition(t.htmlElement.nativeElement,t.image);t.setImageTransform(t.image,e.left,e.top),t.renderer.setStyle(t.image,"visiblity","visible"),t.imageLeft=e.left,t.imageLoaded=!0}},e.prototype.setParallaxPosition=function(e,t){this.setImageSize(e.clientWidth,e.clientHeight,t,this.parallaxPercentage);var i=e.getBoundingClientRect().top+this.scrollTop;this.parallaxBoundaries=this.getParallaxBoundaries(i,e.clientHeight,this.parallaxPercentage);var r=this.getImageLeft(e.clientWidth,t.width,this.positionPercentage),n=this.getImageTop(this.scrollTop,this.parallaxBoundaries);return new a(r,n)},e.prototype.setStaticProperties=function(e,t){this.isAlreadyPositioned(e)||this.renderer.setStyle(e,"position","relative"),this.renderer.setStyle(e,"overflow",this.visibleOverflow?"visible":"hidden"),this.renderer.setStyle(t,"z-index",this.imageZIndex),this.renderer.setStyle(t,"position","absolute"),this.renderer.setStyle(t,"left","0"),this.renderer.setStyle(t,"top","0")},e.prototype.isAlreadyPositioned=function(e){return["absolute","relative"].includes(window.getComputedStyle(e).position)},e.prototype.setImageSize=function(e,t,i,r){var n=t*(100+r)/100;i.naturalHeight/i.naturalWidth>n/e?(this.image.setAttribute("width",e+"px"),this.image.setAttribute("height","auto")):(this.image.setAttribute("height",n+"px"),this.image.setAttribute("width","auto"))},e.prototype.getParallaxBoundaries=function(e,t,i){var r=t/100*i,n=e-r-window.innerHeight,o=e+t+r;return new s(n,o,o-n,r)},e.prototype.setImageTransform=function(e,t,i){this.renderer.setStyle(e,"transform","translate3d("+t+"px, "+i+"px, 0)")},e.prototype.getImageLeft=function(e,t,i){return(e-t)/100*i},e.prototype.getImageTop=function(e,t){var i=Math.max(0,Math.min(e-t.startPoint,t.totalPixels)),r=100/t.totalPixels*i;return-t.usablePixels*(1-r/100)},e}();u.decorators=[{type:t.Directive,args:[{selector:"[libRfxParallax]"}]}],u.ctorParameters=function(){return[{type:t.ElementRef},{type:t.Renderer2},{type:h}]},u.propDecorators={parallaxPercentage:[{type:t.Input}],positionPercentage:[{type:t.Input}],imageUrl:[{type:t.Input}],imageZIndex:[{type:t.Input}],visibleOverflow:[{type:t.Input}],isDisabled:[{type:t.Input}]};var c=function(){};c.decorators=[{type:t.NgModule,args:[{declarations:[u],imports:[],exports:[u]}]}],e.RfxParallaxBoundariesModel=s,e.RfxParallaxDirective=u,e.RfxParallaxModule=c,e.RfxParallaxPositionModel=a,e.RfxParallaxService=h,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("rxjs"),require("resize-observer-polyfill")):"function"==typeof define&&define.amd?define("rfx-parallax",["exports","@angular/core","rxjs","resize-observer-polyfill"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["rfx-parallax"]={},e.ng.core,e.rxjs,e["resize-observer-polyfill"])}(this,(function(e,t,i,r){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=n(r),s=function(e,t,i,r,n){this.startPoint=e,this.endPoint=t,this.totalPixels=i,this.usablePixels=r,this.unusablePixels=n},a=function(e,t){this.left=e,this.top=t};Object.create;function l(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],r=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}Object.create;var h=function(){function e(e){this.rendererFactory=e,this.subjectScroll=new i.BehaviorSubject(void 0),this.subjectResize=new i.BehaviorSubject(void 0),this.renderer=this.rendererFactory.createRenderer(null,null)}return e.prototype.ngOnDestroy=function(){this.elementScrollEvent&&this.elementScrollEvent(),this.windowResizeEvent&&this.windowResizeEvent(),this.elementHeightEvent&&this.elementHeightEvent.disconnect()},e.prototype.initListeners=function(e){var t=this;this.elementScrollEvent=this.renderer.listen(null!=e?e:window,"scroll",(function(e){return t.onMouseScroll(e)})),this.windowResizeEvent=this.renderer.listen(window,"resize",(function(e){return t.onWindowResize(e)})),e&&this.setElementResizeEvent(e)},e.prototype.setElementResizeEvent=function(e){var t,i,r=this;this.elementHeightEvent=new o.default((function(){return r.onWindowResize({target:{innerWidth:e.clientWidth}})}));var n=Array.from(e.children);try{for(var s=l(n),a=s.next();!a.done;a=s.next()){var h=a.value;this.elementHeightEvent.observe(h)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(t)throw t.error}}},e.prototype.onMouseScroll=function(e){var t;this.subjectScroll.next(null!==(t=e.target.scrollTop)&&void 0!==t?t:e.target.documentElement.scrollTop)},e.prototype.getMouseScroll=function(){return this.subjectScroll.asObservable()},e.prototype.onWindowResize=function(e){this.subjectResize.next(e.target.innerWidth)},e.prototype.getWindowResize=function(){return this.subjectResize.asObservable()},e}();h.ɵprov=t.ɵɵdefineInjectable({factory:function(){return new h(t.ɵɵinject(t.RendererFactory2))},token:h,providedIn:"root"}),h.decorators=[{type:t.Injectable,args:[{providedIn:"root"}]}],h.ctorParameters=function(){return[{type:t.RendererFactory2}]};var u=function(){function e(e,t,i){this.htmlElement=e,this.renderer=t,this.rfxParallaxService=i,this.parallaxPercentage=40,this.positionPercentage=50,this.imageZIndex=-1,this.isDisabled=!1,this.visibleOverflow=!1,this.scrollTop=0,this.imageLeft=0}return e.prototype.ngOnInit=function(){this.setListeners()},e.prototype.ngOnDestroy=function(){this.onScrollListener&&this.onScrollListener.unsubscribe(),this.onResizeListener&&this.onResizeListener.unsubscribe()},e.prototype.ngOnChanges=function(e){var t;(null===(t=e.imageUrl)||void 0===t?void 0:t.currentValue)&&this.loadImage(e.imageUrl.currentValue)},e.prototype.setListeners=function(){var e=this;this.onScrollListener=this.rfxParallaxService.getMouseScroll().subscribe((function(t){return e.onMouseScroll(t)})),this.onResizeListener=this.rfxParallaxService.getWindowResize().subscribe((function(t){return e.onWindowResize(t)}))},e.prototype.onMouseScroll=function(e){if(this.scrollTop=null!=e?e:0,this.imageLoaded){var t=this.getImageTop(e,this.parallaxBoundaries);this.setImageTransform(this.image,this.imageLeft,t)}},e.prototype.onWindowResize=function(e){if(void 0!==e&&this.imageLoaded){var t=this.setParallaxPosition(this.htmlElement.nativeElement,this.image);this.imageLeft=t.left,this.setImageTransform(this.image,t.left,t.top)}},e.prototype.loadImage=function(e){var t=this;this.image=new Image,this.image.src=e,this.image.setAttribute("class","parallax-image"),this.renderer.setStyle(this.image,"visiblity","hidden"),this.htmlElement.nativeElement.appendChild(this.image),this.setStaticProperties(this.htmlElement.nativeElement,this.image),this.image.onload=function(){var e=t.setParallaxPosition(t.htmlElement.nativeElement,t.image);t.setImageTransform(t.image,e.left,e.top),t.renderer.setStyle(t.image,"visiblity","visible"),t.imageLeft=e.left,t.imageLoaded=!0}},e.prototype.setParallaxPosition=function(e,t){this.setImageSize(e.clientWidth,e.clientHeight,t,this.parallaxPercentage);var i=e.getBoundingClientRect().top+this.scrollTop;this.parallaxBoundaries=this.getParallaxBoundaries(i,e.clientHeight,this.image.height,this.parallaxPercentage);var r=this.getImageLeft(e.clientWidth,t.width,this.positionPercentage),n=this.getImageTop(this.scrollTop,this.parallaxBoundaries);return new a(r,n)},e.prototype.setStaticProperties=function(e,t){this.isAlreadyPositioned(e)||this.renderer.setStyle(e,"position","relative"),this.renderer.setStyle(e,"overflow",this.visibleOverflow?"visible":"hidden"),this.renderer.setStyle(t,"z-index",this.imageZIndex),this.renderer.setStyle(t,"position","absolute"),this.renderer.setStyle(t,"left","0"),this.renderer.setStyle(t,"top","0")},e.prototype.isAlreadyPositioned=function(e){return["absolute","relative"].includes(window.getComputedStyle(e).position)},e.prototype.setImageSize=function(e,t,i,r){var n=t*(100+r)/100;i.naturalHeight/i.naturalWidth>n/e?(this.image.setAttribute("width",e+"px"),this.image.setAttribute("height","auto")):(this.image.setAttribute("height",n+"px"),this.image.setAttribute("width","auto"))},e.prototype.getParallaxBoundaries=function(e,t,i,r){var n=t/100*r,o=i-t-n,a=e-n-window.innerHeight,l=e+t+n;return new s(a,l,l-a,n,o)},e.prototype.setImageTransform=function(e,t,i){this.renderer.setStyle(e,"transform","translate3d("+t+"px, "+i+"px, 0)")},e.prototype.getImageLeft=function(e,t,i){return(e-t)/100*i},e.prototype.getImageTop=function(e,t){var i=Math.max(0,Math.min(e-t.startPoint,t.totalPixels)),r=100/t.totalPixels*i;return-t.usablePixels*(1-r/100)-t.unusablePixels/2},e}();u.decorators=[{type:t.Directive,args:[{selector:"[libRfxParallax]"}]}],u.ctorParameters=function(){return[{type:t.ElementRef},{type:t.Renderer2},{type:h}]},u.propDecorators={parallaxPercentage:[{type:t.Input}],positionPercentage:[{type:t.Input}],imageUrl:[{type:t.Input}],imageZIndex:[{type:t.Input}],visibleOverflow:[{type:t.Input}],isDisabled:[{type:t.Input}]};var c=function(){};c.decorators=[{type:t.NgModule,args:[{declarations:[u],imports:[],exports:[u]}]}],e.RfxParallaxBoundariesModel=s,e.RfxParallaxDirective=u,e.RfxParallaxModule=c,e.RfxParallaxPositionModel=a,e.RfxParallaxService=h,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=rfx-parallax.umd.min.js.map |
export class RfxParallaxBoundariesModel { | ||
constructor(startPoint, endPoint, totalPixels, usablePixels) { | ||
constructor(startPoint, endPoint, totalPixels, usablePixels, unusablePixels) { | ||
this.startPoint = startPoint; | ||
@@ -7,4 +7,5 @@ this.endPoint = endPoint; | ||
this.usablePixels = usablePixels; | ||
this.unusablePixels = unusablePixels; | ||
} | ||
} | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZ4LXBhcmFsbGF4LWJvdW5kYXJpZXMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiRDovUmVwb3MvUkZYTGlicmFyeS9wcm9qZWN0cy9yZngtcGFyYWxsYXgvc3JjLyIsInNvdXJjZXMiOlsibGliL19tb2RlbHMvcmZ4LXBhcmFsbGF4LWJvdW5kYXJpZXMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLDBCQUEwQjtJQU1yQyxZQUNFLFVBQWtCLEVBQ2xCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFlBQW9CO1FBRXBCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSZnhQYXJhbGxheEJvdW5kYXJpZXNNb2RlbCB7XHJcbiAgcHVibGljIHN0YXJ0UG9pbnQ6IG51bWJlcjtcclxuICBwdWJsaWMgZW5kUG9pbnQ6IG51bWJlcjtcclxuICBwdWJsaWMgdG90YWxQaXhlbHM6IG51bWJlcjtcclxuICBwdWJsaWMgdXNhYmxlUGl4ZWxzOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgc3RhcnRQb2ludDogbnVtYmVyLFxyXG4gICAgZW5kUG9pbnQ6IG51bWJlcixcclxuICAgIHRvdGFsUGl4ZWxzOiBudW1iZXIsXHJcbiAgICB1c2FibGVQaXhlbHM6IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy5zdGFydFBvaW50ID0gc3RhcnRQb2ludDtcclxuICAgIHRoaXMuZW5kUG9pbnQgPSBlbmRQb2ludDtcclxuICAgIHRoaXMudG90YWxQaXhlbHMgPSB0b3RhbFBpeGVscztcclxuICAgIHRoaXMudXNhYmxlUGl4ZWxzID0gdXNhYmxlUGl4ZWxzO1xyXG4gIH1cclxufVxyXG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZ4LXBhcmFsbGF4LWJvdW5kYXJpZXMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiRDovUmVwb3MvUkZYTGlicmFyeS9wcm9qZWN0cy9yZngtcGFyYWxsYXgvc3JjLyIsInNvdXJjZXMiOlsibGliL19tb2RlbHMvcmZ4LXBhcmFsbGF4LWJvdW5kYXJpZXMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLDBCQUEwQjtJQU9yQyxZQUNFLFVBQWtCLEVBQ2xCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFlBQW9CLEVBQ3BCLGNBQXNCO1FBRXRCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSZnhQYXJhbGxheEJvdW5kYXJpZXNNb2RlbCB7XHJcbiAgcHVibGljIHN0YXJ0UG9pbnQ6IG51bWJlcjtcclxuICBwdWJsaWMgZW5kUG9pbnQ6IG51bWJlcjtcclxuICBwdWJsaWMgdG90YWxQaXhlbHM6IG51bWJlcjtcclxuICBwdWJsaWMgdXNhYmxlUGl4ZWxzOiBudW1iZXI7XHJcbiAgcHVibGljIHVudXNhYmxlUGl4ZWxzOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgc3RhcnRQb2ludDogbnVtYmVyLFxyXG4gICAgZW5kUG9pbnQ6IG51bWJlcixcclxuICAgIHRvdGFsUGl4ZWxzOiBudW1iZXIsXHJcbiAgICB1c2FibGVQaXhlbHM6IG51bWJlcixcclxuICAgIHVudXNhYmxlUGl4ZWxzOiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMuc3RhcnRQb2ludCA9IHN0YXJ0UG9pbnQ7XHJcbiAgICB0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7XHJcbiAgICB0aGlzLnRvdGFsUGl4ZWxzID0gdG90YWxQaXhlbHM7XHJcbiAgICB0aGlzLnVzYWJsZVBpeGVscyA9IHVzYWJsZVBpeGVscztcclxuICAgIHRoaXMudW51c2FibGVQaXhlbHMgPSB1bnVzYWJsZVBpeGVscztcclxuICB9XHJcbn1cclxuIl19 |
@@ -71,5 +71,5 @@ import { Directive, ElementRef, Input, Renderer2 } from '@angular/core'; | ||
this.image.setAttribute('class', 'parallax-image'); | ||
this.setStaticProperties(this.htmlElement.nativeElement, this.image); | ||
this.renderer.setStyle(this.image, 'visiblity', 'hidden'); | ||
this.htmlElement.nativeElement.appendChild(this.image); | ||
this.setStaticProperties(this.htmlElement.nativeElement, this.image); | ||
this.image.onload = () => { | ||
@@ -91,3 +91,3 @@ const imagePosition = this.setParallaxPosition(this.htmlElement.nativeElement, this.image); | ||
const elementTop = container.getBoundingClientRect().top + this.scrollTop; | ||
this.parallaxBoundaries = this.getParallaxBoundaries(elementTop, container.clientHeight, this.parallaxPercentage); | ||
this.parallaxBoundaries = this.getParallaxBoundaries(elementTop, container.clientHeight, this.image.height, this.parallaxPercentage); | ||
const imageLeft = this.getImageLeft(container.clientWidth, image.width, this.positionPercentage); | ||
@@ -144,10 +144,12 @@ const imageTop = this.getImageTop(this.scrollTop, this.parallaxBoundaries); | ||
* @param elementHeight main container height in pixels | ||
* @param imageHeight parallax image height in pixels | ||
* @param parallaxPercentage parallax scroll percentage | ||
*/ | ||
getParallaxBoundaries(elementTop, elementHeight, parallaxPercentage) { | ||
getParallaxBoundaries(elementTop, elementHeight, imageHeight, parallaxPercentage) { | ||
const usablePixels = elementHeight / 100 * parallaxPercentage; | ||
const unusablePixels = imageHeight - elementHeight - usablePixels; | ||
const startPoint = elementTop - usablePixels - window.innerHeight; | ||
const endPoint = elementTop + elementHeight + usablePixels; | ||
const totalPixels = endPoint - startPoint; | ||
return new RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels); | ||
return new RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels, unusablePixels); | ||
} | ||
@@ -180,3 +182,3 @@ /** | ||
const parallaxAreaPercentage = 100 / boundaries.totalPixels * parallaxArea; | ||
return -boundaries.usablePixels * (1 - parallaxAreaPercentage / 100); | ||
return -boundaries.usablePixels * (1 - parallaxAreaPercentage / 100) - boundaries.unusablePixels / 2; | ||
} | ||
@@ -202,2 +204,2 @@ } | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZ4LXBhcmFsbGF4LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJEOi9SZXBvcy9SRlhMaWJyYXJ5L3Byb2plY3RzL3JmeC1wYXJhbGxheC9zcmMvIiwic291cmNlcyI6WyJsaWIvcmZ4LXBhcmFsbGF4LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWdDLFNBQVMsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFckgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBS2pGLE1BQU0sT0FBTyxvQkFBb0I7SUFpQi9CLFlBQ1UsV0FBdUIsRUFDdkIsUUFBbUIsRUFDbkIsa0JBQXNDO1FBRnRDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUU5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxF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SUFDSyxZQUFZLENBQUMsY0FBc0IsRUFBRSxVQUFrQixFQUFFLGtCQUEwQjtRQUN6RixPQUFPLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFdBQVcsQ0FBQyxTQUFpQixFQUFFLFVBQXNDO1FBQzNFLE1BQU0sWUFBWSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxzQkFBc0IsR0FBVyxHQUFHLEdBQUcsVUFBVSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7UUFDbkYsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsc0JBQXNCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7O1lBcE5GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2FBQzdCOzs7WUFQbUIsVUFBVTtZQUF1QyxTQUFTO1lBRXJFLGtCQUFrQjs7O2lDQU94QixLQUFLO2lDQUNMLEtBQUs7dUJBQ0wsS0FBSzswQkFDTCxLQUFLOzhCQUNMLEtBQUs7eUJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmZ4UGFyYWxsYXhTZXJ2aWNlIH0gZnJvbSAnLi9yZngtcGFyYWxsYXguc2VydmljZSc7XHJcbmltcG9ydCB7IFJmeFBhcmFsbGF4Qm91bmRhcmllc01vZGVsLCBSZnhQYXJhbGxheFBvc2l0aW9uTW9kZWwgfSBmcm9tICcuL19tb2RlbHMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbGliUmZ4UGFyYWxsYXhdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmZ4UGFyYWxsYXhEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBwdWJsaWMgcGFyYWxsYXhQZXJjZW50YWdlOiBudW1iZXI7XHJcbiAgQElucHV0KCkgcHVibGljIHBvc2l0aW9uUGVyY2VudGFnZTogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpbWFnZVVybDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpbWFnZVpJbmRleDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB2aXNpYmxlT3ZlcmZsb3c6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgcHVibGljIGlzRGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgaW1hZ2VMb2FkZWQ6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBpbWFnZTogSFRNTEltYWdlRWxlbWVudDtcclxuICBwcml2YXRlIGltYWdlTGVmdDogbnVtYmVyO1xyXG4gIHByaXZhdGUgc2Nyb2xsVG9wOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBwYXJhbGxheEJvdW5kYXJpZXM6IFJmeFBhcmFsbGF4Qm91bmRhcmllc01vZGVsO1xyXG5cclxuICBwcml2YXRlIG9uU2Nyb2xsTGlzdGVuZXI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIG9uUmVzaXplTGlzdGVuZXI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0bWxFbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSByZnhQYXJhbGxheFNlcnZpY2U6IFJmeFBhcmFsbGF4U2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5wYXJhbGxheFBlcmNlbnRhZ2UgPSA0MDtcclxuICAgIHRoaXMucG9zaXRpb25QZXJjZW50YWdlID0gNTA7XHJcbiAgICB0aGlzLmltYWdlWkluZGV4ID0gLTE7XHJcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudmlzaWJsZU92ZXJmbG93ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjcm9sbFRvcCA9IDA7XHJcbiAgICB0aGlzLmltYWdlTGVmdCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldExpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub25TY3JvbGxMaXN0ZW5lcikge1xyXG4gICAgICB0aGlzLm9uU2Nyb2xsTGlzdGVuZXIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vblJlc2l6ZUxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMub25SZXNpemVMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLmltYWdlVXJsPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2UoY2hhbmdlcy5pbWFnZVVybC5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaWJlIHRvIHNjcm9sbCBhbmQgcmVzaXplIGxpc3RlbmVyc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0TGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblNjcm9sbExpc3RlbmVyID0gdGhpcy5yZnhQYXJhbGxheFNlcnZpY2UuZ2V0TW91c2VTY3JvbGwoKS5zdWJzY3JpYmUoKHNjcm9sbDogbnVtYmVyKSA9PiB0aGlzLm9uTW91c2VTY3JvbGwoc2Nyb2xsKSk7XHJcbiAgICB0aGlzLm9uUmVzaXplTGlzdGVuZXIgPSB0aGlzLnJmeFBhcmFsbGF4U2VydmljZS5nZXRXaW5kb3dSZXNpemUoKS5zdWJzY3JpYmUoKHdpZHRoOiBudW1iZXIpID0+IHRoaXMub25XaW5kb3dSZXNpemUod2lkdGgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0cmFuc2Zvcm0gcHJvcGVydHkgYmFzZWQgb24gdGhlIG5ldyBzY3JvbGwgdmFsdWVcclxuICAgKiBAcGFyYW0gc2Nyb2xsIG5ldyBlbGVtZW50IHNjcm9sbCB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25Nb3VzZVNjcm9sbChzY3JvbGw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGwgPz8gMDtcclxuXHJcbiAgICBpZiAodGhpcy5pbWFnZUxvYWRlZCkge1xyXG4gICAgICBjb25zdCBpbWFnZVRvcCA9IHRoaXMuZ2V0SW1hZ2VUb3Aoc2Nyb2xsLCB0aGlzLnBhcmFsbGF4Qm91bmRhcmllcyk7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2VUcmFuc2Zvcm0odGhpcy5pbWFnZSwgdGhpcy5pbWFnZUxlZnQsIGltYWdlVG9wKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHBhcmFsbGF4IHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIG5ldyB3aW5kb3cgc2l6ZVxyXG4gICAqIEBwYXJhbSB3aWR0aCB3aW5kb3cgbmV3IHdpZHRoIHZhbHVlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbldpbmRvd1Jlc2l6ZSh3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCAmJiB0aGlzLmltYWdlTG9hZGVkKSB7XHJcbiAgICAgIGNvbnN0IGltYWdlUG9zaXRpb246IFJmeFBhcmFsbGF4UG9zaXRpb25Nb2RlbCA9IHRoaXMuc2V0UGFyYWxsYXhQb3NpdGlvbih0aGlzLmh0bWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuaW1hZ2UpO1xyXG4gICAgICB0aGlzLmltYWdlTGVmdCA9IGltYWdlUG9zaXRpb24ubGVmdDtcclxuICAgICAgdGhpcy5zZXRJbWFnZVRyYW5zZm9ybSh0aGlzLmltYWdlLCBpbWFnZVBvc2l0aW9uLmxlZnQsIGltYWdlUG9zaXRpb24udG9wKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgcGFyYWxsYXggaW1hZ2UgZnJvbSBpbWFnZVVybFxyXG4gICAqIEBwYXJhbSBpbWFnZVVybCBpbWFnZSB1cmxcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRJbWFnZShpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICB0aGlzLmltYWdlLnNyYyA9IGltYWdlVXJsO1xyXG4gICAgdGhpcy5pbWFnZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3BhcmFsbGF4LWltYWdlJyk7XHJcbiAgICB0aGlzLnNldFN0YXRpY1Byb3BlcnRpZXModGhpcy5odG1sRWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmltYWdlKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5pbWFnZSwgJ3Zpc2libGl0eScsICdoaWRkZW4nKTtcclxuICAgIHRoaXMuaHRtbEVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlKTtcclxuXHJcbiAgICB0aGlzLmltYWdlLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgY29uc3QgaW1hZ2VQb3NpdGlvbjogUmZ4UGFyYWxsYXhQb3NpdGlvbk1vZGVsID0gdGhpcy5zZXRQYXJhbGxheFBvc2l0aW9uKHRoaXMuaHRtbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5pbWFnZSk7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2VUcmFuc2Zvcm0odGhpcy5pbWFnZSwgaW1hZ2VQb3NpdGlvbi5sZWZ0LCBpbWFnZVBvc2l0aW9uLnRvcCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5pbWFnZSwgJ3Zpc2libGl0eScsICd2aXNpYmxlJyk7XHJcbiAgICAgIHRoaXMuaW1hZ2VMZWZ0ID0gaW1hZ2VQb3NpdGlvbi5sZWZ0O1xyXG4gICAgICB0aGlzLmltYWdlTG9hZGVkID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZGVmYXVsdCBpbWFnZSBzaXplIGFuZCByZXR1cm4gbmV3IHBhcmFsbGF4IHBvc2l0aW9uXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lciBtYWluIGNvbnRhaW5lciBIVE1MRWxlbWVudFxyXG4gICAqIEBwYXJhbSBpbWFnZSBtYWluIGltYWdlIEhUTUxFbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRQYXJhbGxheFBvc2l0aW9uKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KTogUmZ4UGFyYWxsYXhQb3NpdGlvbk1vZGVsIHtcclxuICAgIHRoaXMuc2V0SW1hZ2VTaXplKGNvbnRhaW5lci5jbGllbnRXaWR0aCwgY29udGFpbmVyLmNsaWVudEhlaWdodCwgaW1hZ2UsIHRoaXMucGFyYWxsYXhQZXJjZW50YWdlKTtcclxuICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5zY3JvbGxUb3A7XHJcbiAgICB0aGlzLnBhcmFsbGF4Qm91bmRhcmllcyA9IHRoaXMuZ2V0UGFyYWxsYXhCb3VuZGFyaWVzKGVsZW1lbnRUb3AsIGNvbnRhaW5lci5jbGllbnRIZWlnaHQsIHRoaXMucGFyYWxsYXhQZXJjZW50YWdlKTtcclxuICAgIGNvbnN0IGltYWdlTGVmdCA9IHRoaXMuZ2V0SW1hZ2VMZWZ0KGNvbnRhaW5lci5jbGllbnRXaWR0aCwgaW1hZ2Uud2lkdGgsIHRoaXMucG9zaXRpb25QZXJjZW50YWdlKTtcclxuICAgIGNvbnN0IGltYWdlVG9wID0gdGhpcy5nZXRJbWFnZVRvcCh0aGlzLnNjcm9sbFRvcCwgdGhpcy5wYXJhbGxheEJvdW5kYXJpZXMpO1xyXG4gICAgcmV0dXJuIG5ldyBSZnhQYXJhbGxheFBvc2l0aW9uTW9kZWwoaW1hZ2VMZWZ0LCBpbWFnZVRvcCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBjb250YWluZXIgYW5kIGltYWdlXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lciBtYWluIGNvbnRhaW5lciBIVE1MRWxlbWVudFxyXG4gICAqIEBwYXJhbSBpbWFnZSBtYWluIGltYWdlIEhUTUxFbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRTdGF0aWNQcm9wZXJ0aWVzKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNBbHJlYWR5UG9zaXRpb25lZChjb250YWluZXIpKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ292ZXJmbG93JywgdGhpcy52aXNpYmxlT3ZlcmZsb3cgPyAndmlzaWJsZScgOiAnaGlkZGVuJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAnei1pbmRleCcsIHRoaXMuaW1hZ2VaSW5kZXgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbWFnZSwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAnbGVmdCcsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAndG9wJywgJzAnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIHBvc2l0aW9uIGFic29sdXRlIG9yIHJlbGF0aXZlXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgaHRtbCBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0FscmVhZHlQb3NpdGlvbmVkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gWydhYnNvbHV0ZScsICdyZWxhdGl2ZSddLmluY2x1ZGVzKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkZWZhdWx0IGltYWdlIHNpemUgdGhhdCBtYXRjaCBwcm9wZXJ0aWVzXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lcldpZHRoIG1haW4gY29udGFpbmVyIEhUTUxFbGVtZW50IHdpZHRoXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lckhlaWdodCBtYWluIGNvbnRhaW5lciBIVE1MRWxlbWVudCBoZWlnaHRcclxuICAgKiBAcGFyYW0gaW1hZ2UgbWFpbiBpbWFnZSBIVE1MRWxlbWVudFxyXG4gICAqIEBwYXJhbSBwYXJhbGxheFBlcmNlbnRhZ2UgcGFyYWxsYXggc2Nyb2xsIHBlcmNlbnRhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIHNldEltYWdlU2l6ZShjb250YWluZXJXaWR0aDogbnVtYmVyLCBjb250YWluZXJIZWlnaHQ6IG51bWJlciwgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQsIHBhcmFsbGF4UGVyY2VudGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBtaW5IZWlnaHQgPSAoY29udGFpbmVySGVpZ2h0ICogKDEwMCArIHBhcmFsbGF4UGVyY2VudGFnZSkpIC8gMTAwO1xyXG4gICAgY29uc3QgcmF0aW8gPSBpbWFnZS5uYXR1cmFsSGVpZ2h0IC8gaW1hZ2UubmF0dXJhbFdpZHRoO1xyXG4gICAgY29uc3QgbWluUmF0aW8gPSBtaW5IZWlnaHQgLyBjb250YWluZXJXaWR0aDtcclxuXHJcbiAgICBpZiAocmF0aW8gPiBtaW5SYXRpbykge1xyXG4gICAgICB0aGlzLmltYWdlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtjb250YWluZXJXaWR0aH1weGApO1xyXG4gICAgICB0aGlzLmltYWdlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYGF1dG9gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2Uuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHttaW5IZWlnaHR9cHhgKTtcclxuICAgICAgdGhpcy5pbWFnZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYGF1dG9gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwYXJhbGxheCBzY3JvbGxpbmcgdmlzaWJsZSBhcmVhLlxyXG4gICAqIFVzZSB0aGlzIHdoZW4gY29udGFpbmVyIG92ZXJmbG93IGlzIGhpZGRlbiBmb3IgYmV0dGVyIHBhZ2UgcGVyZm9ybWFuY2VcclxuICAgKiBAcGFyYW0gZWxlbWVudFRvcCBtYWluIGNvbnRhaW5lciBwb3NpdGlvbiBmcm9tIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50IGluIHBpeGVsc1xyXG4gICAqIEBwYXJhbSBlbGVtZW50SGVpZ2h0IG1haW4gY29udGFpbmVyIGhlaWdodCBpbiBwaXhlbHNcclxuICAgKiBAcGFyYW0gcGFyYWxsYXhQZXJjZW50YWdlIHBhcmFsbGF4IHNjcm9sbCBwZXJjZW50YWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRQYXJhbGxheEJvdW5kYXJpZXMoZWxlbWVudFRvcDogbnVtYmVyLCBlbGVtZW50SGVpZ2h0OiBudW1iZXIsIHBhcmFsbGF4UGVyY2VudGFnZTogbnVtYmVyKTogUmZ4UGFyYWxsYXhCb3VuZGFyaWVzTW9kZWwge1xyXG4gICAgY29uc3QgdXNhYmxlUGl4ZWxzID0gZWxlbWVudEhlaWdodCAvIDEwMCAqIHBhcmFsbGF4UGVyY2VudGFnZTtcclxuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBlbGVtZW50VG9wIC0gdXNhYmxlUGl4ZWxzIC0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgY29uc3QgZW5kUG9pbnQgPSBlbGVtZW50VG9wICsgZWxlbWVudEhlaWdodCArIHVzYWJsZVBpeGVscztcclxuICAgIGNvbnN0IHRvdGFsUGl4ZWxzID0gZW5kUG9pbnQgLSBzdGFydFBvaW50O1xyXG4gICAgcmV0dXJuIG5ldyBSZnhQYXJhbGxheEJvdW5kYXJpZXNNb2RlbChzdGFydFBvaW50LCBlbmRQb2ludCwgdG90YWxQaXhlbHMsIHVzYWJsZVBpeGVscyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgaW1hZ2UgdHJhbnNmb3JtIHByb3BlcnR5XHJcbiAgICogQHBhcmFtIGltYWdlIGltYWdlIEhUTUxJbWFnZUVsZW1lbnQgZWxlbWVudFxyXG4gICAqIEBwYXJhbSBpbWFnZUxlZnQgaW1hZ2UgbGVmdCBzaGlmdCBpbiBwaXhlbHNcclxuICAgKiBAcGFyYW0gaW1hZ2VUb3AgaW1hZ2UgdG9wIHNoaWZ0IGluIHBpeGVsc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0SW1hZ2VUcmFuc2Zvcm0oaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQsIGltYWdlTGVmdDogbnVtYmVyLCBpbWFnZVRvcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAndHJhbnNmb3JtJywgYHRyYW5zbGF0ZTNkKCR7aW1hZ2VMZWZ0fXB4LCAke2ltYWdlVG9wfXB4LCAwKWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGltYWdlIGxlZnQgcHJvcGVydHkgYmFzZWQgb24gcG9zaXRpb25QZXJjZW50YWdlIGluIHBpeGVsc1xyXG4gICAqIEBwYXJhbSBjb250YWluZXJXaWR0aCBtYWluIGNvbnRhaW5lciB3aWR0aCBpbiBwaXhlbHNcclxuICAgKiBAcGFyYW0gaW1hZ2VXaWR0aCBpbWFnZSB3aWR0aCBpbiBwaXhlbHNcclxuICAgKiBAcGFyYW0gcG9zaXRpb25QZXJjZW50YWdlIGltYWdlIHBvc2l0aW9uIHBlcmNlbnRhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGdldEltYWdlTGVmdChjb250YWluZXJXaWR0aDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsIHBvc2l0aW9uUGVyY2VudGFnZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoY29udGFpbmVyV2lkdGggLSBpbWFnZVdpZHRoKSAvIDEwMCAqIHBvc2l0aW9uUGVyY2VudGFnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBpbWFnZSB0b3Agc2hpZnQgaW4gcGl4ZWxzXHJcbiAgICogQHBhcmFtIHNjcm9sbFRvcCBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBwYWdlIHRvIHRoZSBjdXJyZW50IHZpZXdcclxuICAgKiBAcGFyYW0gYm91bmRhcmllcyBwYXJhbGxheCBwb3NpdGlvbiBwb2ludHMgaW5zaWRlIHRoZSBwYWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRJbWFnZVRvcChzY3JvbGxUb3A6IG51bWJlciwgYm91bmRhcmllczogUmZ4UGFyYWxsYXhCb3VuZGFyaWVzTW9kZWwpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcGFyYWxsYXhBcmVhOiBudW1iZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzY3JvbGxUb3AgLSBib3VuZGFyaWVzLnN0YXJ0UG9pbnQsIGJvdW5kYXJpZXMudG90YWxQaXhlbHMpKTtcclxuICAgIGNvbnN0IHBhcmFsbGF4QXJlYVBlcmNlbnRhZ2U6IG51bWJlciA9IDEwMCAvIGJvdW5kYXJpZXMudG90YWxQaXhlbHMgKiBwYXJhbGxheEFyZWE7XHJcbiAgICByZXR1cm4gLWJvdW5kYXJpZXMudXNhYmxlUGl4ZWxzICogKDEgLSBwYXJhbGxheEFyZWFQZXJjZW50YWdlIC8gMTAwKTtcclxuICB9XHJcbn1cclxuIl19 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZ4LXBhcmFsbGF4LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJEOi9SZXBvcy9SRlhMaWJyYXJ5L3Byb2plY3RzL3JmeC1wYXJhbGxheC9zcmMvIiwic291cmNlcyI6WyJsaWIvcmZ4LXBhcmFsbGF4LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWdDLFNBQVMsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFckgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBS2pGLE1BQU0sT0FBTyxvQkFBb0I7SUFpQi9CLFlBQ1UsV0FBdUIsRUFDdkIsUUFBbUIsRUFDbkIsa0JBQXNDO1FBRnRDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUU5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxF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SSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxlQUFlLFNBQVMsT0FBTyxRQUFRLFFBQVEsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBQyxjQUFzQixFQUFFLFVBQWtCLEVBQUUsa0JBQTBCO1FBQ3pGLE9BQU8sQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFDO0lBQ2xFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssV0FBVyxDQUFDLFNBQWlCLEVBQUUsVUFBc0M7UUFDM0UsTUFBTSxZQUFZLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM5RyxNQUFNLHNCQUFzQixHQUFXLEdBQUcsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztRQUNuRixPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2RyxDQUFDOzs7WUEzTkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7YUFDN0I7OztZQVBtQixVQUFVO1lBQXVDLFNBQVM7WUFFckUsa0JBQWtCOzs7aUNBT3hCLEtBQUs7aUNBQ0wsS0FBSzt1QkFDTCxLQUFLOzBCQUNMLEtBQUs7OEJBQ0wsS0FBSzt5QkFDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZnhQYXJhbGxheFNlcnZpY2UgfSBmcm9tICcuL3JmeC1wYXJhbGxheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmZ4UGFyYWxsYXhCb3VuZGFyaWVzTW9kZWwsIFJmeFBhcmFsbGF4UG9zaXRpb25Nb2RlbCB9IGZyb20gJy4vX21vZGVscyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tsaWJSZnhQYXJhbGxheF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZnhQYXJhbGxheERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYXJhbGxheFBlcmNlbnRhZ2U6IG51bWJlcjtcclxuICBASW5wdXQoKSBwdWJsaWMgcG9zaXRpb25QZXJjZW50YWdlOiBudW1iZXI7XHJcbiAgQElucHV0KCkgcHVibGljIGltYWdlVXJsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGltYWdlWkluZGV4OiBudW1iZXI7XHJcbiAgQElucHV0KCkgcHVibGljIHZpc2libGVPdmVyZmxvdzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBpbWFnZUxvYWRlZDogYm9vbGVhbjtcclxuICBwcml2YXRlIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50O1xyXG4gIHByaXZhdGUgaW1hZ2VMZWZ0OiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBzY3JvbGxUb3A6IG51bWJlcjtcclxuICBwcml2YXRlIHBhcmFsbGF4Qm91bmRhcmllczogUmZ4UGFyYWxsYXhCb3VuZGFyaWVzTW9kZWw7XHJcblxyXG4gIHByaXZhdGUgb25TY3JvbGxMaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgb25SZXNpemVMaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaHRtbEVsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJmeFBhcmFsbGF4U2VydmljZTogUmZ4UGFyYWxsYXhTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnBhcmFsbGF4UGVyY2VudGFnZSA9IDQwO1xyXG4gICAgdGhpcy5wb3NpdGlvblBlcmNlbnRhZ2UgPSA1MDtcclxuICAgIHRoaXMuaW1hZ2VaSW5kZXggPSAtMTtcclxuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy52aXNpYmxlT3ZlcmZsb3cgPSBmYWxzZTtcclxuICAgIHRoaXMuc2Nyb2xsVG9wID0gMDtcclxuICAgIHRoaXMuaW1hZ2VMZWZ0ID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vblNjcm9sbExpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMub25TY3JvbGxMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9uUmVzaXplTGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5vblJlc2l6ZUxpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMuaW1hZ2VVcmw/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZShjaGFuZ2VzLmltYWdlVXJsLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdWJzY3JpYmUgdG8gc2Nyb2xsIGFuZCByZXNpemUgbGlzdGVuZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uU2Nyb2xsTGlzdGVuZXIgPSB0aGlzLnJmeFBhcmFsbGF4U2VydmljZS5nZXRNb3VzZVNjcm9sbCgpLnN1YnNjcmliZSgoc2Nyb2xsOiBudW1iZXIpID0+IHRoaXMub25Nb3VzZVNjcm9sbChzY3JvbGwpKTtcclxuICAgIHRoaXMub25SZXNpemVMaXN0ZW5lciA9IHRoaXMucmZ4UGFyYWxsYXhTZXJ2aWNlLmdldFdpbmRvd1Jlc2l6ZSgpLnN1YnNjcmliZSgod2lkdGg6IG51bWJlcikgPT4gdGhpcy5vbldpbmRvd1Jlc2l6ZSh3aWR0aCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRyYW5zZm9ybSBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgbmV3IHNjcm9sbCB2YWx1ZVxyXG4gICAqIEBwYXJhbSBzY3JvbGwgbmV3IGVsZW1lbnQgc2Nyb2xsIHZhbHVlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbk1vdXNlU2Nyb2xsKHNjcm9sbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjcm9sbFRvcCA9IHNjcm9sbCA/PyAwO1xyXG5cclxuICAgIGlmICh0aGlzLmltYWdlTG9hZGVkKSB7XHJcbiAgICAgIGNvbnN0IGltYWdlVG9wID0gdGhpcy5nZXRJbWFnZVRvcChzY3JvbGwsIHRoaXMucGFyYWxsYXhCb3VuZGFyaWVzKTtcclxuICAgICAgdGhpcy5zZXRJbWFnZVRyYW5zZm9ybSh0aGlzLmltYWdlLCB0aGlzLmltYWdlTGVmdCwgaW1hZ2VUb3ApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgcGFyYWxsYXggcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gbmV3IHdpbmRvdyBzaXplXHJcbiAgICogQHBhcmFtIHdpZHRoIHdpbmRvdyBuZXcgd2lkdGggdmFsdWVcclxuICAgKi9cclxuICBwcml2YXRlIG9uV2luZG93UmVzaXplKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaW1hZ2VMb2FkZWQpIHtcclxuICAgICAgY29uc3QgaW1hZ2VQb3NpdGlvbjogUmZ4UGFyYWxsYXhQb3NpdGlvbk1vZGVsID0gdGhpcy5zZXRQYXJhbGxheFBvc2l0aW9uKHRoaXMuaHRtbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5pbWFnZSk7XHJcbiAgICAgIHRoaXMuaW1hZ2VMZWZ0ID0gaW1hZ2VQb3NpdGlvbi5sZWZ0O1xyXG4gICAgICB0aGlzLnNldEltYWdlVHJhbnNmb3JtKHRoaXMuaW1hZ2UsIGltYWdlUG9zaXRpb24ubGVmdCwgaW1hZ2VQb3NpdGlvbi50b3ApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBwYXJhbGxheCBpbWFnZSBmcm9tIGltYWdlVXJsXHJcbiAgICogQHBhcmFtIGltYWdlVXJsIGltYWdlIHVybFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZEltYWdlKGltYWdlVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgIHRoaXMuaW1hZ2Uuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICB0aGlzLmltYWdlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncGFyYWxsYXgtaW1hZ2UnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5pbWFnZSwgJ3Zpc2libGl0eScsICdoaWRkZW4nKTtcclxuICAgIHRoaXMuaHRtbEVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlKTtcclxuICAgIHRoaXMuc2V0U3RhdGljUHJvcGVydGllcyh0aGlzLmh0bWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuaW1hZ2UpO1xyXG5cclxuICAgIHRoaXMuaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbWFnZVBvc2l0aW9uOiBSZnhQYXJhbGxheFBvc2l0aW9uTW9kZWwgPSB0aGlzLnNldFBhcmFsbGF4UG9zaXRpb24odGhpcy5odG1sRWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmltYWdlKTtcclxuICAgICAgdGhpcy5zZXRJbWFnZVRyYW5zZm9ybSh0aGlzLmltYWdlLCBpbWFnZVBvc2l0aW9uLmxlZnQsIGltYWdlUG9zaXRpb24udG9wKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmltYWdlLCAndmlzaWJsaXR5JywgJ3Zpc2libGUnKTtcclxuICAgICAgdGhpcy5pbWFnZUxlZnQgPSBpbWFnZVBvc2l0aW9uLmxlZnQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkZWZhdWx0IGltYWdlIHNpemUgYW5kIHJldHVybiBuZXcgcGFyYWxsYXggcG9zaXRpb25cclxuICAgKiBAcGFyYW0gY29udGFpbmVyIG1haW4gY29udGFpbmVyIEhUTUxFbGVtZW50XHJcbiAgICogQHBhcmFtIGltYWdlIG1haW4gaW1hZ2UgSFRNTEVsZW1lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHNldFBhcmFsbGF4UG9zaXRpb24oY29udGFpbmVyOiBIVE1MRWxlbWVudCwgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpOiBSZnhQYXJhbGxheFBvc2l0aW9uTW9kZWwge1xyXG4gICAgdGhpcy5zZXRJbWFnZVNpemUoY29udGFpbmVyLmNsaWVudFdpZHRoLCBjb250YWluZXIuY2xpZW50SGVpZ2h0LCBpbWFnZSwgdGhpcy5wYXJhbGxheFBlcmNlbnRhZ2UpO1xyXG4gICAgY29uc3QgZWxlbWVudFRvcCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLnNjcm9sbFRvcDtcclxuICAgIHRoaXMucGFyYWxsYXhCb3VuZGFyaWVzID0gdGhpcy5nZXRQYXJhbGxheEJvdW5kYXJpZXMoZWxlbWVudFRvcCwgY29udGFpbmVyLmNsaWVudEhlaWdodCwgdGhpcy5pbWFnZS5oZWlnaHQsIHRoaXMucGFyYWxsYXhQZXJjZW50YWdlKTtcclxuICAgIGNvbnN0IGltYWdlTGVmdCA9IHRoaXMuZ2V0SW1hZ2VMZWZ0KGNvbnRhaW5lci5jbGllbnRXaWR0aCwgaW1hZ2Uud2lkdGgsIHRoaXMucG9zaXRpb25QZXJjZW50YWdlKTtcclxuICAgIGNvbnN0IGltYWdlVG9wID0gdGhpcy5nZXRJbWFnZVRvcCh0aGlzLnNjcm9sbFRvcCwgdGhpcy5wYXJhbGxheEJvdW5kYXJpZXMpO1xyXG4gICAgcmV0dXJuIG5ldyBSZnhQYXJhbGxheFBvc2l0aW9uTW9kZWwoaW1hZ2VMZWZ0LCBpbWFnZVRvcCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBjb250YWluZXIgYW5kIGltYWdlXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lciBtYWluIGNvbnRhaW5lciBIVE1MRWxlbWVudFxyXG4gICAqIEBwYXJhbSBpbWFnZSBtYWluIGltYWdlIEhUTUxFbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRTdGF0aWNQcm9wZXJ0aWVzKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNBbHJlYWR5UG9zaXRpb25lZChjb250YWluZXIpKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ292ZXJmbG93JywgdGhpcy52aXNpYmxlT3ZlcmZsb3cgPyAndmlzaWJsZScgOiAnaGlkZGVuJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAnei1pbmRleCcsIHRoaXMuaW1hZ2VaSW5kZXgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbWFnZSwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAnbGVmdCcsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGltYWdlLCAndG9wJywgJzAnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIHBvc2l0aW9uIGFic29sdXRlIG9yIHJlbGF0aXZlXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgaHRtbCBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0FscmVhZHlQb3NpdGlvbmVkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gWydhYnNvbHV0ZScsICdyZWxhdGl2ZSddLmluY2x1ZGVzKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkZWZhdWx0IGltYWdlIHNpemUgdGhhdCBtYXRjaCBwcm9wZXJ0aWVzXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lcldpZHRoIG1haW4gY29udGFpbmVyIEhUTUxFbGVtZW50IHdpZHRoXHJcbiAgICogQHBhcmFtIGNvbnRhaW5lckhlaWdodCBtYWluIGNvbnRhaW5lciBIVE1MRWxlbWVudCBoZWlnaHRcclxuICAgKiBAcGFyYW0gaW1hZ2UgbWFpbiBpbWFnZSBIVE1MRWxlbWVudFxyXG4gICAqIEBwYXJhbSBwYXJhbGxheFBlcmNlbnRhZ2UgcGFyYWxsYXggc2Nyb2xsIHBlcmNlbnRhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIHNldEltYWdlU2l6ZShjb250YWluZXJXaWR0aDogbnVtYmVyLCBjb250YWluZXJIZWlnaHQ6IG51bWJlciwgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQsIHBhcmFsbGF4UGVyY2VudGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBtaW5IZWlnaHQgPSAoY29udGFpbmVySGVpZ2h0ICogKDEwMCArIHBhcmFsbGF4UGVyY2VudGFnZSkpIC8gMTAwO1xyXG4gICAgY29uc3QgcmF0aW8gPSBpbWFnZS5uYXR1cmFsSGVpZ2h0IC8gaW1hZ2UubmF0dXJhbFdpZHRoO1xyXG4gICAgY29uc3QgbWluUmF0aW8gPSBtaW5IZWlnaHQgLyBjb250YWluZXJXaWR0aDtcclxuXHJcbiAgICBpZiAocmF0aW8gPiBtaW5SYXRpbykge1xyXG4gICAgICB0aGlzLmltYWdlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtjb250YWluZXJXaWR0aH1weGApO1xyXG4gICAgICB0aGlzLmltYWdlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYGF1dG9gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2Uuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHttaW5IZWlnaHR9cHhgKTtcclxuICAgICAgdGhpcy5pbWFnZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYGF1dG9gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwYXJhbGxheCBzY3JvbGxpbmcgdmlzaWJsZSBhcmVhLlxyXG4gICAqIFVzZSB0aGlzIHdoZW4gY29udGFpbmVyIG92ZXJmbG93IGlzIGhpZGRlbiBmb3IgYmV0dGVyIHBhZ2UgcGVyZm9ybWFuY2VcclxuICAgKiBAcGFyYW0gZWxlbWVudFRvcCBtYWluIGNvbnRhaW5lciBwb3NpdGlvbiBmcm9tIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50IGluIHBpeGVsc1xyXG4gICAqIEBwYXJhbSBlbGVtZW50SGVpZ2h0IG1haW4gY29udGFpbmVyIGhlaWdodCBpbiBwaXhlbHNcclxuICAgKiBAcGFyYW0gaW1hZ2VIZWlnaHQgcGFyYWxsYXggaW1hZ2UgaGVpZ2h0IGluIHBpeGVsc1xyXG4gICAqIEBwYXJhbSBwYXJhbGxheFBlcmNlbnRhZ2UgcGFyYWxsYXggc2Nyb2xsIHBlcmNlbnRhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGdldFBhcmFsbGF4Qm91bmRhcmllcyhcclxuICAgIGVsZW1lbnRUb3A6IG51bWJlcixcclxuICAgIGVsZW1lbnRIZWlnaHQ6IG51bWJlcixcclxuICAgIGltYWdlSGVpZ2h0OiBudW1iZXIsXHJcbiAgICBwYXJhbGxheFBlcmNlbnRhZ2U6IG51bWJlclxyXG4gICk6IFJmeFBhcmFsbGF4Qm91bmRhcmllc01vZGVsIHtcclxuICAgIGNvbnN0IHVzYWJsZVBpeGVscyA9IGVsZW1lbnRIZWlnaHQgLyAxMDAgKiBwYXJhbGxheFBlcmNlbnRhZ2U7XHJcbiAgICBjb25zdCB1bnVzYWJsZVBpeGVscyA9IGltYWdlSGVpZ2h0IC0gZWxlbWVudEhlaWdodCAtIHVzYWJsZVBpeGVscztcclxuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBlbGVtZW50VG9wIC0gdXNhYmxlUGl4ZWxzIC0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgY29uc3QgZW5kUG9pbnQgPSBlbGVtZW50VG9wICsgZWxlbWVudEhlaWdodCArIHVzYWJsZVBpeGVscztcclxuICAgIGNvbnN0IHRvdGFsUGl4ZWxzID0gZW5kUG9pbnQgLSBzdGFydFBvaW50O1xyXG4gICAgcmV0dXJuIG5ldyBSZnhQYXJhbGxheEJvdW5kYXJpZXNNb2RlbChzdGFydFBvaW50LCBlbmRQb2ludCwgdG90YWxQaXhlbHMsIHVzYWJsZVBpeGVscywgdW51c2FibGVQaXhlbHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGltYWdlIHRyYW5zZm9ybSBwcm9wZXJ0eVxyXG4gICAqIEBwYXJhbSBpbWFnZSBpbWFnZSBIVE1MSW1hZ2VFbGVtZW50IGVsZW1lbnRcclxuICAgKiBAcGFyYW0gaW1hZ2VMZWZ0IGltYWdlIGxlZnQgc2hpZnQgaW4gcGl4ZWxzXHJcbiAgICogQHBhcmFtIGltYWdlVG9wIGltYWdlIHRvcCBzaGlmdCBpbiBwaXhlbHNcclxuICAgKi9cclxuICBwcml2YXRlIHNldEltYWdlVHJhbnNmb3JtKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBpbWFnZUxlZnQ6IG51bWJlciwgaW1hZ2VUb3A6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbWFnZSwgJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUzZCgke2ltYWdlTGVmdH1weCwgJHtpbWFnZVRvcH1weCwgMClgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBpbWFnZSBsZWZ0IHByb3BlcnR5IGJhc2VkIG9uIHBvc2l0aW9uUGVyY2VudGFnZSBpbiBwaXhlbHNcclxuICAgKiBAcGFyYW0gY29udGFpbmVyV2lkdGggbWFpbiBjb250YWluZXIgd2lkdGggaW4gcGl4ZWxzXHJcbiAgICogQHBhcmFtIGltYWdlV2lkdGggaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uUGVyY2VudGFnZSBpbWFnZSBwb3NpdGlvbiBwZXJjZW50YWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRJbWFnZUxlZnQoY29udGFpbmVyV2lkdGg6IG51bWJlciwgaW1hZ2VXaWR0aDogbnVtYmVyLCBwb3NpdGlvblBlcmNlbnRhZ2U6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGNvbnRhaW5lcldpZHRoIC0gaW1hZ2VXaWR0aCkgLyAxMDAgKiBwb3NpdGlvblBlcmNlbnRhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgaW1hZ2UgdG9wIHNoaWZ0IGluIHBpeGVsc1xyXG4gICAqIEBwYXJhbSBzY3JvbGxUb3AgcGl4ZWxzIGZyb20gdGhlIHRvcCBvZiB0aGUgcGFnZSB0byB0aGUgY3VycmVudCB2aWV3XHJcbiAgICogQHBhcmFtIGJvdW5kYXJpZXMgcGFyYWxsYXggcG9zaXRpb24gcG9pbnRzIGluc2lkZSB0aGUgcGFnZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW1hZ2VUb3Aoc2Nyb2xsVG9wOiBudW1iZXIsIGJvdW5kYXJpZXM6IFJmeFBhcmFsbGF4Qm91bmRhcmllc01vZGVsKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBhcmFsbGF4QXJlYTogbnVtYmVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsVG9wIC0gYm91bmRhcmllcy5zdGFydFBvaW50LCBib3VuZGFyaWVzLnRvdGFsUGl4ZWxzKSk7XHJcbiAgICBjb25zdCBwYXJhbGxheEFyZWFQZXJjZW50YWdlOiBudW1iZXIgPSAxMDAgLyBib3VuZGFyaWVzLnRvdGFsUGl4ZWxzICogcGFyYWxsYXhBcmVhO1xyXG4gICAgcmV0dXJuIC1ib3VuZGFyaWVzLnVzYWJsZVBpeGVscyAqICgxIC0gcGFyYWxsYXhBcmVhUGVyY2VudGFnZSAvIDEwMCkgLSBib3VuZGFyaWVzLnVudXNhYmxlUGl4ZWxzIC8gMjtcclxuICB9XHJcbn1cclxuIl19 |
@@ -6,3 +6,3 @@ import { ɵɵdefineInjectable, ɵɵinject, RendererFactory2, Injectable, Directive, ElementRef, Renderer2, Input, NgModule } from '@angular/core'; | ||
class RfxParallaxBoundariesModel { | ||
constructor(startPoint, endPoint, totalPixels, usablePixels) { | ||
constructor(startPoint, endPoint, totalPixels, usablePixels, unusablePixels) { | ||
this.startPoint = startPoint; | ||
@@ -12,2 +12,3 @@ this.endPoint = endPoint; | ||
this.usablePixels = usablePixels; | ||
this.unusablePixels = unusablePixels; | ||
} | ||
@@ -166,5 +167,5 @@ } | ||
this.image.setAttribute('class', 'parallax-image'); | ||
this.setStaticProperties(this.htmlElement.nativeElement, this.image); | ||
this.renderer.setStyle(this.image, 'visiblity', 'hidden'); | ||
this.htmlElement.nativeElement.appendChild(this.image); | ||
this.setStaticProperties(this.htmlElement.nativeElement, this.image); | ||
this.image.onload = () => { | ||
@@ -186,3 +187,3 @@ const imagePosition = this.setParallaxPosition(this.htmlElement.nativeElement, this.image); | ||
const elementTop = container.getBoundingClientRect().top + this.scrollTop; | ||
this.parallaxBoundaries = this.getParallaxBoundaries(elementTop, container.clientHeight, this.parallaxPercentage); | ||
this.parallaxBoundaries = this.getParallaxBoundaries(elementTop, container.clientHeight, this.image.height, this.parallaxPercentage); | ||
const imageLeft = this.getImageLeft(container.clientWidth, image.width, this.positionPercentage); | ||
@@ -239,10 +240,12 @@ const imageTop = this.getImageTop(this.scrollTop, this.parallaxBoundaries); | ||
* @param elementHeight main container height in pixels | ||
* @param imageHeight parallax image height in pixels | ||
* @param parallaxPercentage parallax scroll percentage | ||
*/ | ||
getParallaxBoundaries(elementTop, elementHeight, parallaxPercentage) { | ||
getParallaxBoundaries(elementTop, elementHeight, imageHeight, parallaxPercentage) { | ||
const usablePixels = elementHeight / 100 * parallaxPercentage; | ||
const unusablePixels = imageHeight - elementHeight - usablePixels; | ||
const startPoint = elementTop - usablePixels - window.innerHeight; | ||
const endPoint = elementTop + elementHeight + usablePixels; | ||
const totalPixels = endPoint - startPoint; | ||
return new RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels); | ||
return new RfxParallaxBoundariesModel(startPoint, endPoint, totalPixels, usablePixels, unusablePixels); | ||
} | ||
@@ -275,3 +278,3 @@ /** | ||
const parallaxAreaPercentage = 100 / boundaries.totalPixels * parallaxArea; | ||
return -boundaries.usablePixels * (1 - parallaxAreaPercentage / 100); | ||
return -boundaries.usablePixels * (1 - parallaxAreaPercentage / 100) - boundaries.unusablePixels / 2; | ||
} | ||
@@ -278,0 +281,0 @@ } |
@@ -6,3 +6,4 @@ export declare class RfxParallaxBoundariesModel { | ||
usablePixels: number; | ||
constructor(startPoint: number, endPoint: number, totalPixels: number, usablePixels: number); | ||
unusablePixels: number; | ||
constructor(startPoint: number, endPoint: number, totalPixels: number, usablePixels: number, unusablePixels: number); | ||
} |
@@ -73,2 +73,3 @@ import { ElementRef, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from '@angular/core'; | ||
* @param elementHeight main container height in pixels | ||
* @param imageHeight parallax image height in pixels | ||
* @param parallaxPercentage parallax scroll percentage | ||
@@ -75,0 +76,0 @@ */ |
{ | ||
"name": "rfx-parallax", | ||
"version": "2.2.2", | ||
"version": "2.2.3", | ||
"description": "RfxParallax - parallax made easy", | ||
@@ -5,0 +5,0 @@ "author": "RedFoxxo", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
209133
1461