diff --git a/esm2020/lib/lightbox-config.service.mjs b/esm2020/lib/lightbox-config.service.mjs new file mode 100644 index 0000000..56fada7 --- /dev/null +++ b/esm2020/lib/lightbox-config.service.mjs @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import * as i0 from "@angular/core"; +export class LightboxConfig { + constructor() { + this.fadeDuration = 0.7; + this.resizeDuration = 0.5; + this.fitImageInViewPort = true; + this.positionFromTop = 20; + this.showImageNumberLabel = false; + this.alwaysShowNavOnTouchDevices = false; + this.wrapAround = false; + this.disableKeyboardNav = false; + this.disableScrolling = false; + this.centerVertically = false; + this.enableTransition = true; + this.albumLabel = 'Image %1 of %2'; + this.showZoom = false; + this.showRotate = false; + this.containerElementResolver = (documentRef) => documentRef.querySelector('body'); + } +} +LightboxConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return []; } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGlnaHRib3gvc3JjL2xpYi9saWdodGJveC1jb25maWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUkzQyxNQUFNLE9BQU8sY0FBYztJQWlCekI7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JGLENBQUM7OzRHQWpDVSxjQUFjO2dIQUFkLGNBQWMsY0FGYixNQUFNOzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbmZpZyB7XHJcbiAgcHVibGljIGZhZGVEdXJhdGlvbjogbnVtYmVyO1xyXG4gIHB1YmxpYyByZXNpemVEdXJhdGlvbjogbnVtYmVyO1xyXG4gIHB1YmxpYyBmaXRJbWFnZUluVmlld1BvcnQ6IGJvb2xlYW47XHJcbiAgcHVibGljIHBvc2l0aW9uRnJvbVRvcDogbnVtYmVyO1xyXG4gIHB1YmxpYyBzaG93SW1hZ2VOdW1iZXJMYWJlbDogYm9vbGVhbjtcclxuICBwdWJsaWMgYWx3YXlzU2hvd05hdk9uVG91Y2hEZXZpY2VzOiBib29sZWFuO1xyXG4gIHB1YmxpYyB3cmFwQXJvdW5kOiBib29sZWFuO1xyXG4gIHB1YmxpYyBkaXNhYmxlS2V5Ym9hcmROYXY6IGJvb2xlYW47XHJcbiAgcHVibGljIGRpc2FibGVTY3JvbGxpbmc6IGJvb2xlYW47XHJcbiAgcHVibGljIGNlbnRlclZlcnRpY2FsbHk6IGJvb2xlYW47XHJcbiAgcHVibGljIGVuYWJsZVRyYW5zaXRpb246IGJvb2xlYW47XHJcbiAgcHVibGljIGFsYnVtTGFiZWw6IHN0cmluZztcclxuICBwdWJsaWMgc2hvd1pvb206IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dSb3RhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIGNvbnRhaW5lckVsZW1lbnRSZXNvbHZlcjogKGRvY3VtZW50OiBhbnkpID0+IEhUTUxFbGVtZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gMC43O1xyXG4gICAgdGhpcy5yZXNpemVEdXJhdGlvbiA9IDAuNTtcclxuICAgIHRoaXMuZml0SW1hZ2VJblZpZXdQb3J0ID0gdHJ1ZTtcclxuICAgIHRoaXMucG9zaXRpb25Gcm9tVG9wID0gMjA7XHJcbiAgICB0aGlzLnNob3dJbWFnZU51bWJlckxhYmVsID0gZmFsc2U7XHJcbiAgICB0aGlzLmFsd2F5c1Nob3dOYXZPblRvdWNoRGV2aWNlcyA9IGZhbHNlO1xyXG4gICAgdGhpcy53cmFwQXJvdW5kID0gZmFsc2U7XHJcbiAgICB0aGlzLmRpc2FibGVLZXlib2FyZE5hdiA9IGZhbHNlO1xyXG4gICAgdGhpcy5kaXNhYmxlU2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmNlbnRlclZlcnRpY2FsbHkgPSBmYWxzZTtcclxuICAgIHRoaXMuZW5hYmxlVHJhbnNpdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLmFsYnVtTGFiZWwgPSAnSW1hZ2UgJTEgb2YgJTInO1xyXG4gICAgdGhpcy5zaG93Wm9vbSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Um90YXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbnRhaW5lckVsZW1lbnRSZXNvbHZlciA9IChkb2N1bWVudFJlZikgPT4gZG9jdW1lbnRSZWYucXVlcnlTZWxlY3RvcignYm9keScpO1xyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file diff --git a/esm2020/lib/lightbox-event.service.mjs b/esm2020/lib/lightbox-event.service.mjs new file mode 100644 index 0000000..fff9802 --- /dev/null +++ b/esm2020/lib/lightbox-event.service.mjs @@ -0,0 +1,47 @@ +import { Subject } from 'rxjs'; +import { Injectable } from '@angular/core'; +import * as i0 from "@angular/core"; +export const LIGHTBOX_EVENT = { + CHANGE_PAGE: 1, + CLOSE: 2, + OPEN: 3, + ZOOM_IN: 4, + ZOOM_OUT: 5, + ROTATE_LEFT: 6, + ROTATE_RIGHT: 7, + FILE_NOT_FOUND: 8 +}; +export class LightboxEvent { + constructor() { + this._lightboxEventSource = new Subject(); + this.lightboxEvent$ = this._lightboxEventSource.asObservable(); + } + broadcastLightboxEvent(event) { + this._lightboxEventSource.next(event); + } +} +LightboxEvent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxEvent.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return []; } }); +function getWindow() { + return window; +} +export class LightboxWindowRef { + get nativeWindow() { + return getWindow(); + } +} +LightboxWindowRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxWindowRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }] }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWdodGJveC9zcmMvbGliL2xpZ2h0Ym94LWV2ZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQWMxQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsV0FBVyxFQUFFLENBQUM7SUFDZCxLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUksRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLENBQUM7SUFDVixRQUFRLEVBQUUsQ0FBQztJQUNYLFdBQVcsRUFBRSxDQUFDO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixjQUFjLEVBQUUsQ0FBQztDQUNsQixDQUFDO0FBS0YsTUFBTSxPQUFPLGFBQWE7SUFHeEI7UUFDRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7OzJHQVZVLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBY0QsU0FBUyxTQUFTO0lBQ2hCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFLRCxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLElBQUksWUFBWTtRQUNaLE9BQU8sU0FBUyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7K0dBSFUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBkYXRhPzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBbGJ1bSB7XHJcbiAgc3JjOiBzdHJpbmc7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB0aHVtYjogc3RyaW5nO1xyXG4gIGlmcmFtZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBMSUdIVEJPWF9FVkVOVCA9IHtcclxuICBDSEFOR0VfUEFHRTogMSxcclxuICBDTE9TRTogMixcclxuICBPUEVOOiAzLFxyXG4gIFpPT01fSU46IDQsXHJcbiAgWk9PTV9PVVQ6IDUsXHJcbiAgUk9UQVRFX0xFRlQ6IDYsXHJcbiAgUk9UQVRFX1JJR0hUOiA3LFxyXG4gIEZJTEVfTk9UX0ZPVU5EOiA4XHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaWdodGJveEV2ZW50IHtcclxuICBwcml2YXRlIF9saWdodGJveEV2ZW50U291cmNlOiBTdWJqZWN0PE9iamVjdD47XHJcbiAgcHVibGljIGxpZ2h0Ym94RXZlbnQkOiBPYnNlcnZhYmxlPE9iamVjdD47XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9saWdodGJveEV2ZW50U291cmNlID0gbmV3IFN1YmplY3Q8T2JqZWN0PigpO1xyXG4gICAgdGhpcy5saWdodGJveEV2ZW50JCA9IHRoaXMuX2xpZ2h0Ym94RXZlbnRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBicm9hZGNhc3RMaWdodGJveEV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpZ2h0Ym94RXZlbnRTb3VyY2UubmV4dChldmVudCk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRXaW5kb3cgKCk6IGFueSB7XHJcbiAgcmV0dXJuIHdpbmRvdztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGlnaHRib3hXaW5kb3dSZWYge1xyXG4gIGdldCBuYXRpdmVXaW5kb3cgKCk6IGFueSB7XHJcbiAgICAgIHJldHVybiBnZXRXaW5kb3coKTtcclxuICB9XHJcbn1cclxuIl19 \ No newline at end of file diff --git a/esm2020/lib/lightbox-overlay.component.mjs b/esm2020/lib/lightbox-overlay.component.mjs new file mode 100644 index 0000000..591c627 --- /dev/null +++ b/esm2020/lib/lightbox-overlay.component.mjs @@ -0,0 +1,86 @@ +import { Component, HostListener, Inject, Input } from '@angular/core'; +import { LIGHTBOX_EVENT } from './lightbox-event.service'; +import { DOCUMENT } from '@angular/common'; +import * as i0 from "@angular/core"; +import * as i1 from "./lightbox-event.service"; +export class LightboxOverlayComponent { + constructor(_elemRef, _rendererRef, _lightboxEvent, _documentRef) { + this._elemRef = _elemRef; + this._rendererRef = _rendererRef; + this._lightboxEvent = _lightboxEvent; + this._documentRef = _documentRef; + this.classList = 'lightboxOverlay animation fadeInOverlay'; + this._subscription = this._lightboxEvent.lightboxEvent$.subscribe((event) => this._onReceivedEvent(event)); + } + close() { + // broadcast to itself and all others subscriber including the components + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + ngAfterViewInit() { + const fadeDuration = this.options.fadeDuration; + this._rendererRef.setStyle(this._elemRef.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._sizeOverlay(); + } + onResize() { + this._sizeOverlay(); + } + ngOnDestroy() { + this._subscription.unsubscribe(); + } + _sizeOverlay() { + const width = this._getOverlayWidth(); + const height = this._getOverlayHeight(); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'width', `${width}px`); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'height', `${height}px`); + } + _onReceivedEvent(event) { + switch (event.id) { + case LIGHTBOX_EVENT.CLOSE: + this._end(); + break; + default: + break; + } + } + _end() { + this.classList = 'lightboxOverlay animation fadeOutOverlay'; + // queue self destruction after the animation has finished + // FIXME: not sure if there is any way better than this + setTimeout(() => { + this.cmpRef.destroy(); + }, this.options.fadeDuration * 1000); + } + _getOverlayWidth() { + return Math.max(this._documentRef.body.scrollWidth, this._documentRef.body.offsetWidth, this._documentRef.documentElement.clientWidth, this._documentRef.documentElement.scrollWidth, this._documentRef.documentElement.offsetWidth); + } + _getOverlayHeight() { + return Math.max(this._documentRef.body.scrollHeight, this._documentRef.body.offsetHeight, this._documentRef.documentElement.clientHeight, this._documentRef.documentElement.scrollHeight, this._documentRef.documentElement.offsetHeight); + } +} +LightboxOverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxOverlayComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.LightboxEvent }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); +LightboxOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: LightboxOverlayComponent, selector: "[lb-overlay]", inputs: { options: "options", cmpRef: "cmpRef" }, host: { listeners: { "click": "close()", "window:resize": "onResize()" }, properties: { "class": "classList" } }, ngImport: i0, template: '', isInline: true }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxOverlayComponent, decorators: [{ + type: Component, + args: [{ + selector: '[lb-overlay]', + template: '', + host: { + '[class]': 'classList' + } + }] + }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.LightboxEvent }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; }, propDecorators: { options: [{ + type: Input + }], cmpRef: [{ + type: Input + }], close: [{ + type: HostListener, + args: ['click'] + }], onResize: [{ + type: HostListener, + args: ['window:resize'] + }] } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtb3ZlcmxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGlnaHRib3gvc3JjL2xpYi9saWdodGJveC1vdmVybGF5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdOLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBVSxjQUFjLEVBQWlCLE1BQU0sMEJBQTBCLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFTM0MsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUNVLFFBQW9CLEVBQ3BCLFlBQXVCLEVBQ3ZCLGNBQTZCLEVBQ1gsWUFBWTtRQUg5QixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ3BCLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQ1gsaUJBQVksR0FBWixZQUFZLENBQUE7UUFFdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyx5Q0FBeUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckgsQ0FBQztJQUdNLEtBQUs7UUFDVix5RUFBeUU7UUFDekUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTSxlQUFlO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBRS9D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QkFBZCxLQUFLO2dCQWNDLEtBQUs7c0JBRFgsWUFBWTt1QkFBQyxPQUFPO2dCQWlCZCxRQUFRO3NCQURkLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFJlbmRlcmVyMlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgSUV2ZW50LCBMSUdIVEJPWF9FVkVOVCwgTGlnaHRib3hFdmVudCB9IGZyb20gJy4vbGlnaHRib3gtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW2xiLW92ZXJsYXldJyxcclxuICB0ZW1wbGF0ZTogJycsXHJcbiAgaG9zdDoge1xyXG4gICAgJ1tjbGFzc10nOiAnY2xhc3NMaXN0J1xyXG4gIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94T3ZlcmxheUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpIGNtcFJlZjogYW55O1xyXG4gIHB1YmxpYyBjbGFzc0xpc3Q7XHJcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9lbGVtUmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXJSZWY6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgX2xpZ2h0Ym94RXZlbnQ6IExpZ2h0Ym94RXZlbnQsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudFJlZixcclxuICApIHtcclxuICAgIHRoaXMuY2xhc3NMaXN0ID0gJ2xpZ2h0Ym94T3ZlcmxheSBhbmltYXRpb24gZmFkZUluT3ZlcmxheSc7XHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSB0aGlzLl9saWdodGJveEV2ZW50LmxpZ2h0Ym94RXZlbnQkLnN1YnNjcmliZSgoZXZlbnQ6IElFdmVudCkgPT4gdGhpcy5fb25SZWNlaXZlZEV2ZW50KGV2ZW50KSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXHJcbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgLy8gYnJvYWRjYXN0IHRvIGl0c2VsZiBhbmQgYWxsIG90aGVycyBzdWJzY3JpYmVyIGluY2x1ZGluZyB0aGUgY29tcG9uZW50c1xyXG4gICAgdGhpcy5fbGlnaHRib3hFdmVudC5icm9hZGNhc3RMaWdodGJveEV2ZW50KHsgaWQ6IExJR0hUQk9YX0VWRU5ULkNMT1NFLCBkYXRhOiBudWxsIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZhZGVEdXJhdGlvbiA9IHRoaXMub3B0aW9ucy5mYWRlRHVyYXRpb247XHJcblxyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fZWxlbVJlZi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb24nLCBgJHtmYWRlRHVyYXRpb259c2ApO1xyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fZWxlbVJlZi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnYW5pbWF0aW9uLWR1cmF0aW9uJywgYCR7ZmFkZUR1cmF0aW9ufXNgKTtcclxuICAgIHRoaXMuX3NpemVPdmVybGF5KCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBwdWJsaWMgb25SZXNpemUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zaXplT3ZlcmxheSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaXplT3ZlcmxheSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0T3ZlcmxheVdpZHRoKCk7XHJcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl9nZXRPdmVybGF5SGVpZ2h0KCk7XHJcblxyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fZWxlbVJlZi5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCBgJHt3aWR0aH1weGApO1xyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fZWxlbVJlZi5uYXRpdmVFbGVtZW50LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vblJlY2VpdmVkRXZlbnQoZXZlbnQ6IElFdmVudCk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChldmVudC5pZCkge1xyXG4gICAgICBjYXNlIExJR0hUQk9YX0VWRU5ULkNMT1NFOlxyXG4gICAgICAgIHRoaXMuX2VuZCgpO1xyXG4gICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lbmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsYXNzTGlzdCA9ICdsaWdodGJveE92ZXJsYXkgYW5pbWF0aW9uIGZhZGVPdXRPdmVybGF5JztcclxuXHJcbiAgICAvLyBxdWV1ZSBzZWxmIGRlc3RydWN0aW9uIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkXHJcbiAgICAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhlcmUgaXMgYW55IHdheSBiZXR0ZXIgdGhhbiB0aGlzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jbXBSZWYuZGVzdHJveSgpO1xyXG4gICAgfSwgdGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiAqIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0T3ZlcmxheVdpZHRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoXHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmJvZHkuc2Nyb2xsV2lkdGgsXHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmJvZHkub2Zmc2V0V2lkdGgsXHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLFxyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRPdmVybGF5SGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoXHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmJvZHkuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5ib2R5Lm9mZnNldEhlaWdodCxcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19 \ No newline at end of file diff --git a/esm2020/lib/lightbox.component.mjs b/esm2020/lib/lightbox.component.mjs new file mode 100644 index 0000000..cde9589 --- /dev/null +++ b/esm2020/lib/lightbox.component.mjs @@ -0,0 +1,610 @@ +import { DOCUMENT } from '@angular/common'; +import { Component, HostListener, Inject, Input, Pipe, SecurityContext, ViewChild, } from '@angular/core'; +import { LIGHTBOX_EVENT } from './lightbox-event.service'; +import * as i0 from "@angular/core"; +import * as i1 from "@angular/platform-browser"; +import * as i2 from "./lightbox-event.service"; +import * as i3 from "@angular/common"; +export class SafePipe { + constructor(sanitizer) { + this.sanitizer = sanitizer; + } + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} +SafePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); +SafePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, name: "safe" }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, decorators: [{ + type: Pipe, + args: [{ name: 'safe' }] + }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } }); +export class LightboxComponent { + constructor(_elemRef, _rendererRef, _lightboxEvent, _lightboxElem, _lightboxWindowRef, _sanitizer, _documentRef) { + this._elemRef = _elemRef; + this._rendererRef = _rendererRef; + this._lightboxEvent = _lightboxEvent; + this._lightboxElem = _lightboxElem; + this._lightboxWindowRef = _lightboxWindowRef; + this._sanitizer = _sanitizer; + this._documentRef = _documentRef; + // initialize data + this.options = this.options || {}; + this.album = this.album || []; + this.currentImageIndex = this.currentImageIndex || 0; + this._windowRef = this._lightboxWindowRef.nativeWindow; + // control the interactive of the directive + this.ui = { + // control the appear of the reloader + // false: image has loaded completely and ready to be shown + // true: image is still loading + showReloader: true, + // control the appear of the nav arrow + // the arrowNav is the parent of both left and right arrow + // in some cases, the parent shows but the child does not show + showLeftArrow: false, + showRightArrow: false, + showArrowNav: false, + // control the appear of the zoom and rotate buttons + showZoomButton: false, + showRotateButton: false, + // control whether to show the + // page number or not + showPageNumber: false, + showCaption: false, + classList: 'lightbox animation fadeIn' + }; + this.content = { + pageNumber: '' + }; + this._event = {}; + this._lightboxElem = this._elemRef; + this._event.subscription = this._lightboxEvent.lightboxEvent$ + .subscribe((event) => this._onReceivedEvent(event)); + this.rotate = 0; + } + ngOnInit() { + this.album.forEach(album => { + if (album.caption) { + album.caption = this._sanitizer.sanitize(SecurityContext.HTML, album.caption); + } + }); + } + ngAfterViewInit() { + // need to init css value here, after the view ready + // actually these values are always 0 + this._cssValue = { + containerTopPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-top')), + containerRightPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-right')), + containerBottomPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-bottom')), + containerLeftPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-left')), + imageBorderWidthTop: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-top-width')), + imageBorderWidthBottom: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-bottom-width')), + imageBorderWidthLeft: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-left-width')), + imageBorderWidthRight: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-right-width')) + }; + if (this._validateInputData()) { + this._prepareComponent(); + this._registerImageLoadingEvent(); + } + } + ngOnDestroy() { + if (!this.options.disableKeyboardNav) { + // unbind keyboard event + this._disableKeyboardNav(); + } + this._event.subscription.unsubscribe(); + } + close($event) { + $event.stopPropagation(); + if ($event.target.classList.contains('lightbox') || + $event.target.classList.contains('lb-loader') || + $event.target.classList.contains('lb-close')) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + } + control($event) { + $event.stopPropagation(); + let height; + let width; + if ($event.target.classList.contains('lb-turnLeft')) { + this.rotate = this.rotate - 90; + this._rotateContainer(); + this._calcTransformPoint(); + this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`; + this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_LEFT, data: null }); + } + else if ($event.target.classList.contains('lb-turnRight')) { + this.rotate = this.rotate + 90; + this._rotateContainer(); + this._calcTransformPoint(); + this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`; + this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_RIGHT, data: null }); + } + else if ($event.target.classList.contains('lb-zoomOut')) { + height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) / 1.5; + width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) / 1.5; + this._documentRef.getElementById('outerContainer').style.height = height + 'px'; + this._documentRef.getElementById('outerContainer').style.width = width + 'px'; + height = parseInt(this._documentRef.getElementById('image').style.height, 10) / 1.5; + width = parseInt(this._documentRef.getElementById('image').style.width, 10) / 1.5; + this._documentRef.getElementById('image').style.height = height + 'px'; + this._documentRef.getElementById('image').style.width = width + 'px'; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_OUT, data: null }); + } + else if ($event.target.classList.contains('lb-zoomIn')) { + height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) * 1.5; + width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) * 1.5; + this._documentRef.getElementById('outerContainer').style.height = height + 'px'; + this._documentRef.getElementById('outerContainer').style.width = width + 'px'; + height = parseInt(this._documentRef.getElementById('image').style.height, 10) * 1.5; + width = parseInt(this._documentRef.getElementById('image').style.width, 10) * 1.5; + this._documentRef.getElementById('image').style.height = height + 'px'; + this._documentRef.getElementById('image').style.width = width + 'px'; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_IN, data: null }); + } + } + _rotateContainer() { + let temp = this.rotate; + if (temp < 0) { + temp *= -1; + } + if (temp / 90 % 4 === 1 || temp / 90 % 4 === 3) { + this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.height; + this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height; + } + else { + this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.height; + this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height; + } + } + _resetImage() { + this.rotate = 0; + const image = this._documentRef.getElementById('image'); + if (image) { + image.style.transform = `rotate(${this.rotate}deg)`; + image.style.webkitTransform = `rotate(${this.rotate}deg)`; + } + } + _calcTransformPoint() { + let height = parseInt(this._documentRef.getElementById('image').style.height, 10); + let width = parseInt(this._documentRef.getElementById('image').style.width, 10); + let temp = this.rotate % 360; + if (temp < 0) { + temp = 360 + temp; + } + if (temp === 90) { + this._documentRef.getElementById('image').style.transformOrigin = (height / 2) + 'px ' + (height / 2) + 'px'; + } + else if (temp === 180) { + this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (height / 2) + 'px'; + } + else if (temp === 270) { + this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (width / 2) + 'px'; + } + } + nextImage() { + if (this.album.length === 1) { + return; + } + else if (this.currentImageIndex === this.album.length - 1) { + this._changeImage(0); + } + else { + this._changeImage(this.currentImageIndex + 1); + } + } + prevImage() { + if (this.album.length === 1) { + return; + } + else if (this.currentImageIndex === 0 && this.album.length > 1) { + this._changeImage(this.album.length - 1); + } + else { + this._changeImage(this.currentImageIndex - 1); + } + } + _validateInputData() { + if (this.album && + this.album instanceof Array && + this.album.length > 0) { + for (let i = 0; i < this.album.length; i++) { + // check whether each _nside + // album has src data or not + if (this.album[i].src) { + continue; + } + throw new Error('One of the album data does not have source data'); + } + } + else { + throw new Error('No album data or album data is not correct in type'); + } + // to prevent data understand as string + // convert it to number + if (isNaN(this.currentImageIndex)) { + throw new Error('Current image index is not a number'); + } + else { + this.currentImageIndex = Number(this.currentImageIndex); + } + return true; + } + _registerImageLoadingEvent() { + const src = this.album[this.currentImageIndex].src; + if (this.album[this.currentImageIndex].iframe || this.needsIframe(src)) { + setTimeout(() => { + this._onLoadImageSuccess(); + }); + return; + } + const preloader = new Image(); + preloader.onload = () => { + this._onLoadImageSuccess(); + }; + preloader.onerror = (e) => { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.FILE_NOT_FOUND, data: e }); + }; + preloader.src = this._sanitizer.sanitize(SecurityContext.URL, src); + } + /** + * Fire when the image is loaded + */ + _onLoadImageSuccess() { + if (!this.options.disableKeyboardNav) { + // unbind keyboard event during transition + this._disableKeyboardNav(); + } + let imageHeight; + let imageWidth; + let maxImageHeight; + let maxImageWidth; + let windowHeight; + let windowWidth; + let naturalImageWidth; + let naturalImageHeight; + // set default width and height of image to be its natural + imageWidth = naturalImageWidth = this._imageElem ? this._imageElem.nativeElement.naturalWidth : this._windowRef.innerWidth * .8; + imageHeight = naturalImageHeight = this._imageElem ? this._imageElem.nativeElement.naturalHeight : this._windowRef.innerHeight * .8; + if (this.options.fitImageInViewPort) { + windowWidth = this._windowRef.innerWidth; + windowHeight = this._windowRef.innerHeight; + maxImageWidth = windowWidth - this._cssValue.containerLeftPadding - + this._cssValue.containerRightPadding - this._cssValue.imageBorderWidthLeft - + this._cssValue.imageBorderWidthRight - 20; + maxImageHeight = windowHeight - this._cssValue.containerTopPadding - + this._cssValue.containerTopPadding - this._cssValue.imageBorderWidthTop - + this._cssValue.imageBorderWidthBottom - 120; + if (naturalImageWidth > maxImageWidth || naturalImageHeight > maxImageHeight) { + if ((naturalImageWidth / maxImageWidth) > (naturalImageHeight / maxImageHeight)) { + imageWidth = maxImageWidth; + imageHeight = Math.round(naturalImageHeight / (naturalImageWidth / imageWidth)); + } + else { + imageHeight = maxImageHeight; + imageWidth = Math.round(naturalImageWidth / (naturalImageHeight / imageHeight)); + } + } + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'width', `${imageWidth}px`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'height', `${imageHeight}px`); + } + this._sizeContainer(imageWidth, imageHeight); + if (this.options.centerVertically) { + this._centerVertically(imageWidth, imageHeight); + } + } + _centerVertically(imageWidth, imageHeight) { + const scrollOffset = this._documentRef.documentElement.scrollTop; + const windowHeight = this._windowRef.innerHeight; + const viewOffset = windowHeight / 2 - imageHeight / 2; + const topDistance = scrollOffset + viewOffset; + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${topDistance}px`); + } + _sizeContainer(imageWidth, imageHeight) { + const oldWidth = this._outerContainerElem.nativeElement.offsetWidth; + const oldHeight = this._outerContainerElem.nativeElement.offsetHeight; + const newWidth = imageWidth + this._cssValue.containerRightPadding + this._cssValue.containerLeftPadding + + this._cssValue.imageBorderWidthLeft + this._cssValue.imageBorderWidthRight; + const newHeight = imageHeight + this._cssValue.containerTopPadding + this._cssValue.containerBottomPadding + + this._cssValue.imageBorderWidthTop + this._cssValue.imageBorderWidthBottom; + // make sure that distances are large enough for transitionend event to be fired, at least 5px. + if (Math.abs(oldWidth - newWidth) + Math.abs(oldHeight - newHeight) > 5) { + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'width', `${newWidth}px`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'height', `${newHeight}px`); + // bind resize event to outer container + // use enableTransition to prevent infinite loader + if (this.options.enableTransition) { + this._event.transitions = []; + ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd', 'MSTransitionEnd'].forEach(eventName => { + this._event.transitions.push(this._rendererRef.listen(this._outerContainerElem.nativeElement, eventName, (event) => { + if (event.target === event.currentTarget) { + this._postResize(newWidth, newHeight); + } + })); + }); + } + else { + this._postResize(newWidth, newHeight); + } + } + else { + this._postResize(newWidth, newHeight); + } + } + _postResize(newWidth, newHeight) { + // unbind resize event + if (Array.isArray(this._event.transitions)) { + this._event.transitions.forEach((eventHandler) => { + eventHandler(); + }); + this._event.transitions = []; + } + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'width', `${newWidth}px`); + this._showImage(); + } + _showImage() { + this.ui.showReloader = false; + this._updateNav(); + this._updateDetails(); + if (!this.options.disableKeyboardNav) { + this._enableKeyboardNav(); + } + } + _prepareComponent() { + // add css3 animation + this._addCssAnimation(); + // position the image according to user's option + this._positionLightBox(); + // update controls visibility on next view generation + setTimeout(() => { + this.ui.showZoomButton = this.options.showZoom; + this.ui.showRotateButton = this.options.showRotate; + }, 0); + } + _positionLightBox() { + // @see https://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll + const top = (this._windowRef.pageYOffset || this._documentRef.documentElement.scrollTop) + + this.options.positionFromTop; + const left = this._windowRef.pageXOffset || this._documentRef.documentElement.scrollLeft; + if (!this.options.centerVertically) { + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${top}px`); + } + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'left', `${left}px`); + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'display', 'block'); + // disable scrolling of the page while open + if (this.options.disableScrolling) { + this._rendererRef.addClass(this._documentRef.documentElement, 'lb-disable-scrolling'); + } + } + /** + * addCssAnimation add css3 classes for animate lightbox + */ + _addCssAnimation() { + const resizeDuration = this.options.resizeDuration; + const fadeDuration = this.options.fadeDuration; + this._rendererRef.setStyle(this._lightboxElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, '-webkit-transition-duration', `${resizeDuration}s`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'transition-duration', `${resizeDuration}s`); + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._captionElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._captionElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._numberElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._numberElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + } + _end() { + this.ui.classList = 'lightbox animation fadeOut'; + if (this.options.disableScrolling) { + this._rendererRef.removeClass(this._documentRef.documentElement, 'lb-disable-scrolling'); + } + setTimeout(() => { + this.cmpRef.destroy(); + }, this.options.fadeDuration * 1000); + } + _updateDetails() { + // update the caption + if (typeof this.album[this.currentImageIndex].caption !== 'undefined' && + this.album[this.currentImageIndex].caption !== '') { + this.ui.showCaption = true; + } + // update the page number if user choose to do so + // does not perform numbering the page if the + // array length in album <= 1 + if (this.album.length > 1 && this.options.showImageNumberLabel) { + this.ui.showPageNumber = true; + this.content.pageNumber = this._albumLabel(); + } + } + _albumLabel() { + // due to {this.currentImageIndex} is set from 0 to {this.album.length} - 1 + return this.options.albumLabel.replace(/%1/g, Number(this.currentImageIndex + 1)).replace(/%2/g, this.album.length); + } + _changeImage(newIndex) { + this._resetImage(); + this.currentImageIndex = newIndex; + this._hideImage(); + this._registerImageLoadingEvent(); + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CHANGE_PAGE, data: newIndex }); + } + _hideImage() { + this.ui.showReloader = true; + this.ui.showArrowNav = false; + this.ui.showLeftArrow = false; + this.ui.showRightArrow = false; + this.ui.showPageNumber = false; + this.ui.showCaption = false; + } + _updateNav() { + let alwaysShowNav = false; + // check to see the browser support touch event + try { + this._documentRef.createEvent('TouchEvent'); + alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false; + } + catch (e) { + // noop + } + // initially show the arrow nav + // which is the parent of both left and right nav + this._showArrowNav(); + if (this.album.length > 1) { + if (this.options.wrapAround) { + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1'); + this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1'); + this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1'); + } + // alternatives this.$lightbox.find('.lb-prev, .lb-next').show(); + this._showLeftArrowNav(); + this._showRightArrowNav(); + } + else { + if (this.currentImageIndex > 0) { + // alternatives this.$lightbox.find('.lb-prev').show(); + this._showLeftArrowNav(); + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-prev').css('opacity', '1'); + this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1'); + } + } + if (this.currentImageIndex < this.album.length - 1) { + // alternatives this.$lightbox.find('.lb-next').show(); + this._showRightArrowNav(); + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-next').css('opacity', '1'); + this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1'); + } + } + } + } + } + _showLeftArrowNav() { + this.ui.showLeftArrow = true; + } + _showRightArrowNav() { + this.ui.showRightArrow = true; + } + _showArrowNav() { + this.ui.showArrowNav = (this.album.length !== 1); + } + _enableKeyboardNav() { + this._event.keyup = this._rendererRef.listen('document', 'keyup', (event) => { + this._keyboardAction(event); + }); + } + _disableKeyboardNav() { + if (this._event.keyup) { + this._event.keyup(); + } + } + _keyboardAction($event) { + const KEYCODE_ESC = 27; + const KEYCODE_LEFTARROW = 37; + const KEYCODE_RIGHTARROW = 39; + const keycode = $event.keyCode; + const key = String.fromCharCode(keycode).toLowerCase(); + if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + else if (key === 'p' || keycode === KEYCODE_LEFTARROW) { + if (this.currentImageIndex !== 0) { + this._changeImage(this.currentImageIndex - 1); + } + else if (this.options.wrapAround && this.album.length > 1) { + this._changeImage(this.album.length - 1); + } + } + else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) { + if (this.currentImageIndex !== this.album.length - 1) { + this._changeImage(this.currentImageIndex + 1); + } + else if (this.options.wrapAround && this.album.length > 1) { + this._changeImage(0); + } + } + } + _getCssStyleValue(elem, propertyName) { + return parseFloat(this._windowRef + .getComputedStyle(elem.nativeElement, null) + .getPropertyValue(propertyName)); + } + _onReceivedEvent(event) { + switch (event.id) { + case LIGHTBOX_EVENT.CLOSE: + this._end(); + break; + default: + break; + } + } + needsIframe(src) { + // const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, src); + if (src.match(/\.pdf$/)) { + return true; + } + return false; + } +} +LightboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.LightboxEvent }, { token: i0.ElementRef }, { token: i2.LightboxWindowRef }, { token: i1.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); +LightboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: LightboxComponent, selector: "[lb-content]", inputs: { album: "album", currentImageIndex: "currentImageIndex", options: "options", cmpRef: "cmpRef" }, host: { listeners: { "close": "close($event)" }, properties: { "class": "ui.classList" } }, viewQueries: [{ propertyName: "_outerContainerElem", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "_containerElem", first: true, predicate: ["container"], descendants: true }, { propertyName: "_leftArrowElem", first: true, predicate: ["leftArrow"], descendants: true }, { propertyName: "_rightArrowElem", first: true, predicate: ["rightArrow"], descendants: true }, { propertyName: "_navArrowElem", first: true, predicate: ["navArrow"], descendants: true }, { propertyName: "_dataContainerElem", first: true, predicate: ["dataContainer"], descendants: true }, { propertyName: "_imageElem", first: true, predicate: ["image"], descendants: true }, { propertyName: "_iframeElem", first: true, predicate: ["iframe"], descendants: true }, { propertyName: "_captionElem", first: true, predicate: ["caption"], descendants: true }, { propertyName: "_numberElem", first: true, predicate: ["number"], descendants: true }], ngImport: i0, template: "
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
", directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "safe": SafePipe } }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxComponent, decorators: [{ + type: Component, + args: [{ selector: '[lb-content]', host: { + '[class]': 'ui.classList' + }, template: "
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
" }] + }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.LightboxEvent }, { type: i0.ElementRef }, { type: i2.LightboxWindowRef }, { type: i1.DomSanitizer }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; }, propDecorators: { album: [{ + type: Input + }], currentImageIndex: [{ + type: Input + }], options: [{ + type: Input + }], cmpRef: [{ + type: Input + }], _outerContainerElem: [{ + type: ViewChild, + args: ['outerContainer'] + }], _containerElem: [{ + type: ViewChild, + args: ['container'] + }], _leftArrowElem: [{ + type: ViewChild, + args: ['leftArrow'] + }], _rightArrowElem: [{ + type: ViewChild, + args: ['rightArrow'] + }], _navArrowElem: [{ + type: ViewChild, + args: ['navArrow'] + }], _dataContainerElem: [{ + type: ViewChild, + args: ['dataContainer'] + }], _imageElem: [{ + type: ViewChild, + args: ['image'] + }], _iframeElem: [{ + type: ViewChild, + args: ['iframe'] + }], _captionElem: [{ + type: ViewChild, + args: ['caption'] + }], _numberElem: [{ + type: ViewChild, + args: ['number'] + }], close: [{ + type: HostListener, + args: ['close', ['$event']] + }] } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWxpZ2h0Ym94L3NyYy9saWIvbGlnaHRib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWxpZ2h0Ym94L3NyYy9saWIvbGlnaHRib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUcsSUFBSSxFQUVaLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFpQixjQUFjLEVBQW1DLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBRzFHLE1BQU0sT0FBTyxRQUFRO0lBQ25CLFlBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7SUFBRyxDQUFDO0lBQy9DLFNBQVMsQ0FBQyxHQUFHO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7O3NHQUpVLFFBQVE7b0dBQVIsUUFBUTs0RkFBUixRQUFRO2tCQURwQixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTs7QUFldEIsTUFBTSxPQUFPLGlCQUFpQjtJQXFCNUIsWUFDVSxRQUFvQixFQUNwQixZQUF1QixFQUN2QixjQUE2QixFQUM5QixhQUF5QixFQUN4QixrQkFBcUMsRUFDckMsVUFBd0IsRUFDTixZQUFZO1FBTjlCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQVc7UUFDdkIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQVk7UUFDeEIsdUJBQWtCLEdBQWxC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QyxVQUFVO2dCQUNPLGtCQUFrQjtzQkFBN0MsU0FBUzt1QkFBQyxlQUFlO2dCQUNOLFVBQVU7c0JBQTdCLFNBQVM7dUJBQUMsT0FBTztnQkFDRyxXQUFXO3NCQUEvQixTQUFTO3VCQUFDLFFBQVE7Z0JBQ0csWUFBWTtzQkFBakMsU0FBUzt1QkFBQyxTQUFTO2dCQUNDLFdBQVc7c0JBQS9CLFNBQVM7dUJBQUMsUUFBUTtnQkFnR1osS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsIFBpcGUsIFBpcGVUcmFuc2Zvcm0sXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNlY3VyaXR5Q29udGV4dCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RG9tU2FuaXRpemVyfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7SUFsYnVtLCBJRXZlbnQsIExJR0hUQk9YX0VWRU5ULCBMaWdodGJveEV2ZW50LCBMaWdodGJveFdpbmRvd1JlZn0gZnJvbSAnLi9saWdodGJveC1ldmVudC5zZXJ2aWNlJztcclxuXHJcbkBQaXBlKHsgbmFtZTogJ3NhZmUnIH0pXHJcbmV4cG9ydCBjbGFzcyBTYWZlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XHJcbiAgdHJhbnNmb3JtKHVybCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdbbGItY29udGVudF0nLFxyXG4gIGhvc3Q6IHtcclxuICAgICdbY2xhc3NdJzogJ3VpLmNsYXNzTGlzdCdcclxuICB9LFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vbGlnaHRib3guY29tcG9uZW50Lmh0bWxcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgYWxidW06IEFycmF5PElBbGJ1bT47XHJcbiAgQElucHV0KCkgY3VycmVudEltYWdlSW5kZXg6IG51bWJlcjtcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KCkgY21wUmVmOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnb3V0ZXJDb250YWluZXInKSBfb3V0ZXJDb250YWluZXJFbGVtOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIF9jb250YWluZXJFbGVtOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2xlZnRBcnJvdycpIF9sZWZ0QXJyb3dFbGVtOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3JpZ2h0QXJyb3cnKSBfcmlnaHRBcnJvd0VsZW06IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnbmF2QXJyb3cnKSBfbmF2QXJyb3dFbGVtOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2RhdGFDb250YWluZXInKSBfZGF0YUNvbnRhaW5lckVsZW06IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnaW1hZ2UnKSBfaW1hZ2VFbGVtOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2lmcmFtZScpIF9pZnJhbWVFbGVtOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2NhcHRpb24nKSBfY2FwdGlvbkVsZW06IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnbnVtYmVyJykgX251bWJlckVsZW06IEVsZW1lbnRSZWY7XHJcbiAgcHVibGljIGNvbnRlbnQ6IGFueTtcclxuICBwdWJsaWMgdWk6IGFueTtcclxuICBwcml2YXRlIF9jc3NWYWx1ZTogYW55O1xyXG4gIHByaXZhdGUgX2V2ZW50OiBhbnk7XHJcbiAgcHJpdmF0ZSBfd2luZG93UmVmOiBhbnk7XHJcbiAgcHJpdmF0ZSByb3RhdGU6IG51bWJlcjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2VsZW1SZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIF9yZW5kZXJlclJlZjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBfbGlnaHRib3hFdmVudDogTGlnaHRib3hFdmVudCxcclxuICAgIHB1YmxpYyBfbGlnaHRib3hFbGVtOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBfbGlnaHRib3hXaW5kb3dSZWY6IExpZ2h0Ym94V2luZG93UmVmLFxyXG4gICAgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudFJlZlxyXG4gICkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBkYXRhXHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgfHwge307XHJcbiAgICB0aGlzLmFsYnVtID0gdGhpcy5hbGJ1bSB8fCBbXTtcclxuICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRJbWFnZUluZGV4IHx8IDA7XHJcbiAgICB0aGlzLl93aW5kb3dSZWYgPSB0aGlzLl9saWdodGJveFdpbmRvd1JlZi5uYXRpdmVXaW5kb3c7XHJcblxyXG4gICAgLy8gY29udHJvbCB0aGUgaW50ZXJhY3RpdmUgb2YgdGhlIGRpcmVjdGl2ZVxyXG4gICAgdGhpcy51aSA9IHtcclxuICAgICAgLy8gY29udHJvbCB0aGUgYXBwZWFyIG9mIHRoZSByZWxvYWRlclxyXG4gICAgICAvLyBmYWxzZTogaW1hZ2UgaGFzIGxvYWRlZCBjb21wbGV0ZWx5IGFuZCByZWFkeSB0byBiZSBzaG93blxyXG4gICAgICAvLyB0cnVlOiBpbWFnZSBpcyBzdGlsbCBsb2FkaW5nXHJcbiAgICAgIHNob3dSZWxvYWRlcjogdHJ1ZSxcclxuXHJcbiAgICAgIC8vIGNvbnRyb2wgdGhlIGFwcGVhciBvZiB0aGUgbmF2IGFycm93XHJcbiAgICAgIC8vIHRoZSBhcnJvd05hdiBpcyB0aGUgcGFyZW50IG9mIGJvdGggbGVmdCBhbmQgcmlnaHQgYXJyb3dcclxuICAgICAgLy8gaW4gc29tZSBjYXNlcywgdGhlIHBhcmVudCBzaG93cyBidXQgdGhlIGNoaWxkIGRvZXMgbm90IHNob3dcclxuICAgICAgc2hvd0xlZnRBcnJvdzogZmFsc2UsXHJcbiAgICAgIHNob3dSaWdodEFycm93OiBmYWxzZSxcclxuICAgICAgc2hvd0Fycm93TmF2OiBmYWxzZSxcclxuXHJcbiAgICAgIC8vIGNvbnRyb2wgdGhlIGFwcGVhciBvZiB0aGUgem9vbSBhbmQgcm90YXRlIGJ1dHRvbnNcclxuICAgICAgc2hvd1pvb21CdXR0b246IGZhbHNlLFxyXG4gICAgICBzaG93Um90YXRlQnV0dG9uOiBmYWxzZSxcclxuXHJcbiAgICAgIC8vIGNvbnRyb2wgd2hldGhlciB0byBzaG93IHRoZVxyXG4gICAgICAvLyBwYWdlIG51bWJlciBvciBub3RcclxuICAgICAgc2hvd1BhZ2VOdW1iZXI6IGZhbHNlLFxyXG4gICAgICBzaG93Q2FwdGlvbjogZmFsc2UsXHJcbiAgICAgIGNsYXNzTGlzdDogJ2xpZ2h0Ym94IGFuaW1hdGlvbiBmYWRlSW4nXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY29udGVudCA9IHtcclxuICAgICAgcGFnZU51bWJlcjogJydcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fZXZlbnQgPSB7fTtcclxuICAgIHRoaXMuX2xpZ2h0Ym94RWxlbSA9IHRoaXMuX2VsZW1SZWY7XHJcbiAgICB0aGlzLl9ldmVudC5zdWJzY3JpcHRpb24gPSB0aGlzLl9saWdodGJveEV2ZW50LmxpZ2h0Ym94RXZlbnQkXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBJRXZlbnQpID0+IHRoaXMuX29uUmVjZWl2ZWRFdmVudChldmVudCkpO1xyXG4gICAgdGhpcy5yb3RhdGUgPSAwO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFsYnVtLmZvckVhY2goYWxidW0gPT4ge1xyXG4gICAgICBpZiAoYWxidW0uY2FwdGlvbikge1xyXG4gICAgICAgIGFsYnVtLmNhcHRpb24gPSB0aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIGFsYnVtLmNhcHRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAvLyBuZWVkIHRvIGluaXQgY3NzIHZhbHVlIGhlcmUsIGFmdGVyIHRoZSB2aWV3IHJlYWR5XHJcbiAgICAvLyBhY3R1YWxseSB0aGVzZSB2YWx1ZXMgYXJlIGFsd2F5cyAwXHJcbiAgICB0aGlzLl9jc3NWYWx1ZSA9IHtcclxuICAgICAgY29udGFpbmVyVG9wUGFkZGluZzogTWF0aC5yb3VuZCh0aGlzLl9nZXRDc3NTdHlsZVZhbHVlKHRoaXMuX2NvbnRhaW5lckVsZW0sICdwYWRkaW5nLXRvcCcpKSxcclxuICAgICAgY29udGFpbmVyUmlnaHRQYWRkaW5nOiBNYXRoLnJvdW5kKHRoaXMuX2dldENzc1N0eWxlVmFsdWUodGhpcy5fY29udGFpbmVyRWxlbSwgJ3BhZGRpbmctcmlnaHQnKSksXHJcbiAgICAgIGNvbnRhaW5lckJvdHRvbVBhZGRpbmc6IE1hdGgucm91bmQodGhpcy5fZ2V0Q3NzU3R5bGVWYWx1ZSh0aGlzLl9jb250YWluZXJFbGVtLCAncGFkZGluZy1ib3R0b20nKSksXHJcbiAgICAgIGNvbnRhaW5lckxlZnRQYWRkaW5nOiBNYXRoLnJvdW5kKHRoaXMuX2dldENzc1N0eWxlVmFsdWUodGhpcy5fY29udGFpbmVyRWxlbSwgJ3BhZGRpbmctbGVmdCcpKSxcclxuICAgICAgaW1hZ2VCb3JkZXJXaWR0aFRvcDogTWF0aC5yb3VuZCh0aGlzLl9nZXRDc3NTdHlsZVZhbHVlKHRoaXMuX2ltYWdlRWxlbSB8fCB0aGlzLl9pZnJhbWVFbGVtLCAnYm9yZGVyLXRvcC13aWR0aCcpKSxcclxuICAgICAgaW1hZ2VCb3JkZXJXaWR0aEJvdHRvbTogTWF0aC5yb3VuZCh0aGlzLl9nZXRDc3NTdHlsZVZhbHVlKHRoaXMuX2ltYWdlRWxlbSB8fCB0aGlzLl9pZnJhbWVFbGVtLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcpKSxcclxuICAgICAgaW1hZ2VCb3JkZXJXaWR0aExlZnQ6IE1hdGgucm91bmQodGhpcy5fZ2V0Q3NzU3R5bGVWYWx1ZSh0aGlzLl9pbWFnZUVsZW0gfHwgdGhpcy5faWZyYW1lRWxlbSwgJ2JvcmRlci1sZWZ0LXdpZHRoJykpLFxyXG4gICAgICBpbWFnZUJvcmRlcldpZHRoUmlnaHQ6IE1hdGgucm91bmQodGhpcy5fZ2V0Q3NzU3R5bGVWYWx1ZSh0aGlzLl9pbWFnZUVsZW0gfHwgdGhpcy5faWZyYW1lRWxlbSwgJ2JvcmRlci1yaWdodC13aWR0aCcpKVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVJbnB1dERhdGEoKSkge1xyXG4gICAgICB0aGlzLl9wcmVwYXJlQ29tcG9uZW50KCk7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVySW1hZ2VMb2FkaW5nRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmRpc2FibGVLZXlib2FyZE5hdikge1xyXG4gICAgICAvLyB1bmJpbmQga2V5Ym9hcmQgZXZlbnRcclxuICAgICAgdGhpcy5fZGlzYWJsZUtleWJvYXJkTmF2KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZXZlbnQuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbG9zZScsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIGNsb3NlKCRldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpZ2h0Ym94JykgfHxcclxuICAgICAgJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2xiLWxvYWRlcicpIHx8XHJcbiAgICAgICRldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsYi1jbG9zZScpKSB7XHJcbiAgICAgIHRoaXMuX2xpZ2h0Ym94RXZlbnQuYnJvYWRjYXN0TGlnaHRib3hFdmVudCh7IGlkOiBMSUdIVEJPWF9FVkVOVC5DTE9TRSwgZGF0YTogbnVsbCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb250cm9sKCRldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBsZXQgaGVpZ2h0OiBudW1iZXI7XHJcbiAgICBsZXQgd2lkdGg6IG51bWJlcjtcclxuICAgIGlmICgkZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnbGItdHVybkxlZnQnKSkge1xyXG4gICAgICB0aGlzLnJvdGF0ZSA9IHRoaXMucm90YXRlIC0gOTA7XHJcbiAgICAgIHRoaXMuX3JvdGF0ZUNvbnRhaW5lcigpO1xyXG4gICAgICB0aGlzLl9jYWxjVHJhbnNmb3JtUG9pbnQoKTtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke3RoaXMucm90YXRlfWRlZylgO1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBgcm90YXRlKCR7dGhpcy5yb3RhdGV9ZGVnKWA7XHJcbiAgICAgIHRoaXMuX2xpZ2h0Ym94RXZlbnQuYnJvYWRjYXN0TGlnaHRib3hFdmVudCh7IGlkOiBMSUdIVEJPWF9FVkVOVC5ST1RBVEVfTEVGVCwgZGF0YTogbnVsbCB9KTtcclxuICAgIH0gZWxzZSBpZiAoJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2xiLXR1cm5SaWdodCcpKSB7XHJcbiAgICAgIHRoaXMucm90YXRlID0gdGhpcy5yb3RhdGUgKyA5MDtcclxuICAgICAgdGhpcy5fcm90YXRlQ29udGFpbmVyKCk7XHJcbiAgICAgIHRoaXMuX2NhbGNUcmFuc2Zvcm1Qb2ludCgpO1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS50cmFuc2Zvcm0gPSBgcm90YXRlKCR7dGhpcy5yb3RhdGV9ZGVnKWA7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdpbWFnZScpLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IGByb3RhdGUoJHt0aGlzLnJvdGF0ZX1kZWcpYDtcclxuICAgICAgdGhpcy5fbGlnaHRib3hFdmVudC5icm9hZGNhc3RMaWdodGJveEV2ZW50KHsgaWQ6IExJR0hUQk9YX0VWRU5ULlJPVEFURV9SSUdIVCwgZGF0YTogbnVsbCB9KTtcclxuICAgIH0gZWxzZSBpZiAoJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2xiLXpvb21PdXQnKSkge1xyXG4gICAgICBoZWlnaHQgPSBwYXJzZUludCh0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKS5zdHlsZS5oZWlnaHQsIDEwKSAvIDEuNTtcclxuICAgICAgd2lkdGggPSBwYXJzZUludCh0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKS5zdHlsZS53aWR0aCwgMTApIC8gMS41O1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKS5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgICAgaGVpZ2h0ID0gcGFyc2VJbnQodGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUuaGVpZ2h0LCAxMCkgLyAxLjU7XHJcbiAgICAgIHdpZHRoID0gcGFyc2VJbnQodGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUud2lkdGgsIDEwKSAvIDEuNTtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XHJcbiAgICAgIHRoaXMuX2xpZ2h0Ym94RXZlbnQuYnJvYWRjYXN0TGlnaHRib3hFdmVudCh7IGlkOiBMSUdIVEJPWF9FVkVOVC5aT09NX09VVCwgZGF0YTogbnVsbCB9KTtcclxuICAgIH0gZWxzZSBpZiAoJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2xiLXpvb21JbicpKSB7XHJcbiAgICAgIGhlaWdodCA9IHBhcnNlSW50KHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdvdXRlckNvbnRhaW5lcicpLnN0eWxlLmhlaWdodCwgMTApICogMS41O1xyXG4gICAgICB3aWR0aCA9IHBhcnNlSW50KHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdvdXRlckNvbnRhaW5lcicpLnN0eWxlLndpZHRoLCAxMCkgKiAxLjU7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdvdXRlckNvbnRhaW5lcicpLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdvdXRlckNvbnRhaW5lcicpLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gICAgICBoZWlnaHQgPSBwYXJzZUludCh0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS5oZWlnaHQsIDEwKSAqIDEuNTtcclxuICAgICAgd2lkdGggPSBwYXJzZUludCh0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS53aWR0aCwgMTApICogMS41O1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgICAgdGhpcy5fbGlnaHRib3hFdmVudC5icm9hZGNhc3RMaWdodGJveEV2ZW50KHsgaWQ6IExJR0hUQk9YX0VWRU5ULlpPT01fSU4sIGRhdGE6IG51bGwgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yb3RhdGVDb250YWluZXIoKTogdm9pZCB7XHJcbiAgICBsZXQgdGVtcCA9IHRoaXMucm90YXRlO1xyXG4gICAgaWYgKHRlbXAgPCAwKSB7XHJcbiAgICAgIHRlbXAgKj0gLTE7XHJcbiAgICB9XHJcbiAgICBpZiAodGVtcCAvIDkwICUgNCA9PT0gMSB8fCB0ZW1wIC8gOTAgJSA0ID09PSAzKSB7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdvdXRlckNvbnRhaW5lcicpLnN0eWxlLmhlaWdodCA9IHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdpbWFnZScpLnN0eWxlLndpZHRoO1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKS5zdHlsZS53aWR0aCA9IHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdpbWFnZScpLnN0eWxlLmhlaWdodDtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLnN0eWxlLmhlaWdodCA9IHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdpbWFnZScpLnN0eWxlLndpZHRoO1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuc3R5bGUud2lkdGggPSB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS5oZWlnaHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKS5zdHlsZS5oZWlnaHQgPSB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS5oZWlnaHQ7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdvdXRlckNvbnRhaW5lcicpLnN0eWxlLndpZHRoID0gdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUud2lkdGg7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5zdHlsZS5oZWlnaHQgPSB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS53aWR0aDtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLnN0eWxlLndpZHRoID0gdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUuaGVpZ2h0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzZXRJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm90YXRlID0gMDtcclxuICAgIGNvbnN0IGltYWdlID0gdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJyk7XHJcbiAgICBpZiAoaW1hZ2UpIHtcclxuICAgICAgaW1hZ2Uuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke3RoaXMucm90YXRlfWRlZylgO1xyXG4gICAgICBpbWFnZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBgcm90YXRlKCR7dGhpcy5yb3RhdGV9ZGVnKWA7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FsY1RyYW5zZm9ybVBvaW50KCk6IHZvaWQge1xyXG4gICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KHRoaXMuX2RvY3VtZW50UmVmLmdldEVsZW1lbnRCeUlkKCdpbWFnZScpLnN0eWxlLmhlaWdodCwgMTApO1xyXG4gICAgbGV0IHdpZHRoID0gcGFyc2VJbnQodGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUud2lkdGgsIDEwKTtcclxuICAgIGxldCB0ZW1wID0gdGhpcy5yb3RhdGUgJSAzNjA7XHJcbiAgICBpZiAodGVtcCA8IDApIHtcclxuICAgICAgdGVtcCA9IDM2MCArIHRlbXA7XHJcbiAgICB9XHJcbiAgICBpZiAodGVtcCA9PT0gOTApIHtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gKGhlaWdodCAvIDIpICsgJ3B4ICcgKyAoaGVpZ2h0IC8gMikgKyAncHgnO1xyXG4gICAgfSBlbHNlIGlmICh0ZW1wID09PSAxODApIHtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJykuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gKHdpZHRoIC8gMikgKyAncHggJyArIChoZWlnaHQgLyAyKSArICdweCc7XHJcbiB9IGVsc2UgaWYgKHRlbXAgPT09IDI3MCkge1xyXG4gICAgICB0aGlzLl9kb2N1bWVudFJlZi5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKS5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAod2lkdGggLyAyKSArICdweCAnICsgKHdpZHRoIC8gMikgKyAncHgnO1xyXG4gfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5leHRJbWFnZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFsYnVtLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudEltYWdlSW5kZXggPT09IHRoaXMuYWxidW0ubGVuZ3RoIC0gMSkge1xyXG4gICAgICB0aGlzLl9jaGFuZ2VJbWFnZSgwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2NoYW5nZUltYWdlKHRoaXMuY3VycmVudEltYWdlSW5kZXggKyAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmV2SW1hZ2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hbGJ1bS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID09PSAwICYmIHRoaXMuYWxidW0ubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLl9jaGFuZ2VJbWFnZSh0aGlzLmFsYnVtLmxlbmd0aCAtIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fY2hhbmdlSW1hZ2UodGhpcy5jdXJyZW50SW1hZ2VJbmRleCAtIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmFsaWRhdGVJbnB1dERhdGEoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hbGJ1bSAmJlxyXG4gICAgICB0aGlzLmFsYnVtIGluc3RhbmNlb2YgQXJyYXkgJiZcclxuICAgICAgdGhpcy5hbGJ1bS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hbGJ1bS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZWFjaCBfbnNpZGVcclxuICAgICAgICAvLyBhbGJ1bSBoYXMgc3JjIGRhdGEgb3Igbm90XHJcbiAgICAgICAgaWYgKHRoaXMuYWxidW1baV0uc3JjKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT25lIG9mIHRoZSBhbGJ1bSBkYXRhIGRvZXMgbm90IGhhdmUgc291cmNlIGRhdGEnKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhbGJ1bSBkYXRhIG9yIGFsYnVtIGRhdGEgaXMgbm90IGNvcnJlY3QgaW4gdHlwZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvIHByZXZlbnQgZGF0YSB1bmRlcnN0YW5kIGFzIHN0cmluZ1xyXG4gICAgLy8gY29udmVydCBpdCB0byBudW1iZXJcclxuICAgIGlmIChpc05hTih0aGlzLmN1cnJlbnRJbWFnZUluZGV4KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0N1cnJlbnQgaW1hZ2UgaW5kZXggaXMgbm90IGEgbnVtYmVyJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gTnVtYmVyKHRoaXMuY3VycmVudEltYWdlSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJJbWFnZUxvYWRpbmdFdmVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNyYzogYW55ID0gdGhpcy5hbGJ1bVt0aGlzLmN1cnJlbnRJbWFnZUluZGV4XS5zcmM7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxidW1bdGhpcy5jdXJyZW50SW1hZ2VJbmRleF0uaWZyYW1lIHx8IHRoaXMubmVlZHNJZnJhbWUoc3JjKSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkSW1hZ2VTdWNjZXNzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJlbG9hZGVyID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgcHJlbG9hZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5fb25Mb2FkSW1hZ2VTdWNjZXNzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZGVyLm9uZXJyb3IgPSAoZSkgPT4ge1xyXG4gICAgICB0aGlzLl9saWdodGJveEV2ZW50LmJyb2FkY2FzdExpZ2h0Ym94RXZlbnQoeyBpZDogTElHSFRCT1hfRVZFTlQuRklMRV9OT1RfRk9VTkQsIGRhdGE6IGUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZGVyLnNyYyA9IHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuVVJMLCBzcmMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZSB3aGVuIHRoZSBpbWFnZSBpcyBsb2FkZWRcclxuICAgKi9cclxuICBwcml2YXRlIF9vbkxvYWRJbWFnZVN1Y2Nlc3MoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlS2V5Ym9hcmROYXYpIHtcclxuICAgICAgLy8gdW5iaW5kIGtleWJvYXJkIGV2ZW50IGR1cmluZyB0cmFuc2l0aW9uXHJcbiAgICAgIHRoaXMuX2Rpc2FibGVLZXlib2FyZE5hdigpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpbWFnZUhlaWdodDtcclxuICAgIGxldCBpbWFnZVdpZHRoO1xyXG4gICAgbGV0IG1heEltYWdlSGVpZ2h0O1xyXG4gICAgbGV0IG1heEltYWdlV2lkdGg7XHJcbiAgICBsZXQgd2luZG93SGVpZ2h0O1xyXG4gICAgbGV0IHdpbmRvd1dpZHRoO1xyXG4gICAgbGV0IG5hdHVyYWxJbWFnZVdpZHRoO1xyXG4gICAgbGV0IG5hdHVyYWxJbWFnZUhlaWdodDtcclxuXHJcbiAgICAvLyBzZXQgZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGltYWdlIHRvIGJlIGl0cyBuYXR1cmFsXHJcbiAgICBpbWFnZVdpZHRoID0gbmF0dXJhbEltYWdlV2lkdGggPSB0aGlzLl9pbWFnZUVsZW0gPyB0aGlzLl9pbWFnZUVsZW0ubmF0aXZlRWxlbWVudC5uYXR1cmFsV2lkdGggOiB0aGlzLl93aW5kb3dSZWYuaW5uZXJXaWR0aCAqIC44O1xyXG4gICAgaW1hZ2VIZWlnaHQgPSBuYXR1cmFsSW1hZ2VIZWlnaHQgPSB0aGlzLl9pbWFnZUVsZW0gPyB0aGlzLl9pbWFnZUVsZW0ubmF0aXZlRWxlbWVudC5uYXR1cmFsSGVpZ2h0IDogdGhpcy5fd2luZG93UmVmLmlubmVySGVpZ2h0ICogLjg7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmZpdEltYWdlSW5WaWV3UG9ydCkge1xyXG4gICAgICB3aW5kb3dXaWR0aCA9IHRoaXMuX3dpbmRvd1JlZi5pbm5lcldpZHRoO1xyXG4gICAgICB3aW5kb3dIZWlnaHQgPSB0aGlzLl93aW5kb3dSZWYuaW5uZXJIZWlnaHQ7XHJcbiAgICAgIG1heEltYWdlV2lkdGggPSB3aW5kb3dXaWR0aCAtIHRoaXMuX2Nzc1ZhbHVlLmNvbnRhaW5lckxlZnRQYWRkaW5nIC1cclxuICAgICAgICB0aGlzLl9jc3NWYWx1ZS5jb250YWluZXJSaWdodFBhZGRpbmcgLSB0aGlzLl9jc3NWYWx1ZS5pbWFnZUJvcmRlcldpZHRoTGVmdCAtXHJcbiAgICAgICAgdGhpcy5fY3NzVmFsdWUuaW1hZ2VCb3JkZXJXaWR0aFJpZ2h0IC0gMjA7XHJcbiAgICAgIG1heEltYWdlSGVpZ2h0ID0gd2luZG93SGVpZ2h0IC0gdGhpcy5fY3NzVmFsdWUuY29udGFpbmVyVG9wUGFkZGluZyAtXHJcbiAgICAgICAgdGhpcy5fY3NzVmFsdWUuY29udGFpbmVyVG9wUGFkZGluZyAtIHRoaXMuX2Nzc1ZhbHVlLmltYWdlQm9yZGVyV2lkdGhUb3AgLVxyXG4gICAgICAgIHRoaXMuX2Nzc1ZhbHVlLmltYWdlQm9yZGVyV2lkdGhCb3R0b20gLSAxMjA7XHJcbiAgICAgIGlmIChuYXR1cmFsSW1hZ2VXaWR0aCA+IG1heEltYWdlV2lkdGggfHwgbmF0dXJhbEltYWdlSGVpZ2h0ID4gbWF4SW1hZ2VIZWlnaHQpIHtcclxuICAgICAgICBpZiAoKG5hdHVyYWxJbWFnZVdpZHRoIC8gbWF4SW1hZ2VXaWR0aCkgPiAobmF0dXJhbEltYWdlSGVpZ2h0IC8gbWF4SW1hZ2VIZWlnaHQpKSB7XHJcbiAgICAgICAgICBpbWFnZVdpZHRoID0gbWF4SW1hZ2VXaWR0aDtcclxuICAgICAgICAgIGltYWdlSGVpZ2h0ID0gTWF0aC5yb3VuZChuYXR1cmFsSW1hZ2VIZWlnaHQgLyAobmF0dXJhbEltYWdlV2lkdGggLyBpbWFnZVdpZHRoKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGltYWdlSGVpZ2h0ID0gbWF4SW1hZ2VIZWlnaHQ7XHJcbiAgICAgICAgICBpbWFnZVdpZHRoID0gTWF0aC5yb3VuZChuYXR1cmFsSW1hZ2VXaWR0aCAvIChuYXR1cmFsSW1hZ2VIZWlnaHQgLyBpbWFnZUhlaWdodCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUoKHRoaXMuX2ltYWdlRWxlbSB8fCB0aGlzLl9pZnJhbWVFbGVtKS5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCBgJHtpbWFnZVdpZHRofXB4YCk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKCh0aGlzLl9pbWFnZUVsZW0gfHwgdGhpcy5faWZyYW1lRWxlbSkubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIGAke2ltYWdlSGVpZ2h0fXB4YCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2l6ZUNvbnRhaW5lcihpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXJWZXJ0aWNhbGx5KSB7XHJcbiAgICAgIHRoaXMuX2NlbnRlclZlcnRpY2FsbHkoaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2VudGVyVmVydGljYWxseShpbWFnZVdpZHRoOiBudW1iZXIsIGltYWdlSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMuX2RvY3VtZW50UmVmLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB0aGlzLl93aW5kb3dSZWYuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgY29uc3Qgdmlld09mZnNldCA9IHdpbmRvd0hlaWdodCAvIDIgLSBpbWFnZUhlaWdodCAvIDI7XHJcbiAgICBjb25zdCB0b3BEaXN0YW5jZSA9IHNjcm9sbE9mZnNldCArIHZpZXdPZmZzZXQ7XHJcblxyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fbGlnaHRib3hFbGVtLm5hdGl2ZUVsZW1lbnQsICd0b3AnLCBgJHt0b3BEaXN0YW5jZX1weGApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2l6ZUNvbnRhaW5lcihpbWFnZVdpZHRoOiBudW1iZXIsIGltYWdlSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9sZFdpZHRoID0gdGhpcy5fb3V0ZXJDb250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICBjb25zdCBvbGRIZWlnaHQgPSB0aGlzLl9vdXRlckNvbnRhaW5lckVsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBuZXdXaWR0aCA9IGltYWdlV2lkdGggKyB0aGlzLl9jc3NWYWx1ZS5jb250YWluZXJSaWdodFBhZGRpbmcgKyB0aGlzLl9jc3NWYWx1ZS5jb250YWluZXJMZWZ0UGFkZGluZyArXHJcbiAgICAgIHRoaXMuX2Nzc1ZhbHVlLmltYWdlQm9yZGVyV2lkdGhMZWZ0ICsgdGhpcy5fY3NzVmFsdWUuaW1hZ2VCb3JkZXJXaWR0aFJpZ2h0O1xyXG4gICAgY29uc3QgbmV3SGVpZ2h0ID0gaW1hZ2VIZWlnaHQgKyB0aGlzLl9jc3NWYWx1ZS5jb250YWluZXJUb3BQYWRkaW5nICsgdGhpcy5fY3NzVmFsdWUuY29udGFpbmVyQm90dG9tUGFkZGluZyArXHJcbiAgICAgIHRoaXMuX2Nzc1ZhbHVlLmltYWdlQm9yZGVyV2lkdGhUb3AgKyB0aGlzLl9jc3NWYWx1ZS5pbWFnZUJvcmRlcldpZHRoQm90dG9tO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGRpc3RhbmNlcyBhcmUgbGFyZ2UgZW5vdWdoIGZvciB0cmFuc2l0aW9uZW5kIGV2ZW50IHRvIGJlIGZpcmVkLCBhdCBsZWFzdCA1cHguXHJcbiAgICBpZiAoTWF0aC5hYnMob2xkV2lkdGggLSBuZXdXaWR0aCkgKyBNYXRoLmFicyhvbGRIZWlnaHQgLSBuZXdIZWlnaHQpID4gNSkge1xyXG4gICAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9vdXRlckNvbnRhaW5lckVsZW0ubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgYCR7bmV3V2lkdGh9cHhgKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fb3V0ZXJDb250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCBgJHtuZXdIZWlnaHR9cHhgKTtcclxuXHJcbiAgICAgIC8vIGJpbmQgcmVzaXplIGV2ZW50IHRvIG91dGVyIGNvbnRhaW5lclxyXG4gICAgICAvLyB1c2UgZW5hYmxlVHJhbnNpdGlvbiB0byBwcmV2ZW50IGluZmluaXRlIGxvYWRlclxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZVRyYW5zaXRpb24pIHtcclxuICAgICAgICB0aGlzLl9ldmVudC50cmFuc2l0aW9ucyA9IFtdO1xyXG4gICAgICAgIFsndHJhbnNpdGlvbmVuZCcsICd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ29UcmFuc2l0aW9uRW5kJywgJ01TVHJhbnNpdGlvbkVuZCddLmZvckVhY2goZXZlbnROYW1lID0+IHtcclxuICAgICAgICAgIHRoaXMuX2V2ZW50LnRyYW5zaXRpb25zLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyUmVmLmxpc3Rlbih0aGlzLl9vdXRlckNvbnRhaW5lckVsZW0ubmF0aXZlRWxlbWVudCwgZXZlbnROYW1lLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Bvc3RSZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9wb3N0UmVzaXplKG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9wb3N0UmVzaXplKG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcG9zdFJlc2l6ZShuZXdXaWR0aDogbnVtYmVyLCBuZXdIZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgLy8gdW5iaW5kIHJlc2l6ZSBldmVudFxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fZXZlbnQudHJhbnNpdGlvbnMpKSB7XHJcbiAgICAgIHRoaXMuX2V2ZW50LnRyYW5zaXRpb25zLmZvckVhY2goKGV2ZW50SGFuZGxlcjogYW55KSA9PiB7XHJcbiAgICAgICAgZXZlbnRIYW5kbGVyKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5fZXZlbnQudHJhbnNpdGlvbnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9kYXRhQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCBgJHtuZXdXaWR0aH1weGApO1xyXG4gICAgdGhpcy5fc2hvd0ltYWdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93SW1hZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVpLnNob3dSZWxvYWRlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5fdXBkYXRlTmF2KCk7XHJcbiAgICB0aGlzLl91cGRhdGVEZXRhaWxzKCk7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlS2V5Ym9hcmROYXYpIHtcclxuICAgICAgdGhpcy5fZW5hYmxlS2V5Ym9hcmROYXYoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVDb21wb25lbnQoKTogdm9pZCB7XHJcbiAgICAvLyBhZGQgY3NzMyBhbmltYXRpb25cclxuICAgIHRoaXMuX2FkZENzc0FuaW1hdGlvbigpO1xyXG5cclxuICAgIC8vIHBvc2l0aW9uIHRoZSBpbWFnZSBhY2NvcmRpbmcgdG8gdXNlcidzIG9wdGlvblxyXG4gICAgdGhpcy5fcG9zaXRpb25MaWdodEJveCgpO1xyXG5cclxuICAgIC8vIHVwZGF0ZSBjb250cm9scyB2aXNpYmlsaXR5IG9uIG5leHQgdmlldyBnZW5lcmF0aW9uXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51aS5zaG93Wm9vbUJ1dHRvbiA9IHRoaXMub3B0aW9ucy5zaG93Wm9vbTtcclxuICAgICAgdGhpcy51aS5zaG93Um90YXRlQnV0dG9uID0gdGhpcy5vcHRpb25zLnNob3dSb3RhdGU7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Bvc2l0aW9uTGlnaHRCb3goKTogdm9pZCB7XHJcbiAgICAvLyBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0NjQ4NzYvamF2YXNjcmlwdC1nZXQtd2luZG93LXgteS1wb3NpdGlvbi1mb3Itc2Nyb2xsXHJcbiAgICBjb25zdCB0b3AgPSAodGhpcy5fd2luZG93UmVmLnBhZ2VZT2Zmc2V0IHx8IHRoaXMuX2RvY3VtZW50UmVmLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApICtcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uRnJvbVRvcDtcclxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLl93aW5kb3dSZWYucGFnZVhPZmZzZXQgfHwgdGhpcy5fZG9jdW1lbnRSZWYuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuY2VudGVyVmVydGljYWxseSkge1xyXG4gICAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9saWdodGJveEVsZW0ubmF0aXZlRWxlbWVudCwgJ3RvcCcsIGAke3RvcH1weGApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKHRoaXMuX2xpZ2h0Ym94RWxlbS5uYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAke2xlZnR9cHhgKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKHRoaXMuX2xpZ2h0Ym94RWxlbS5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsICdibG9jaycpO1xyXG5cclxuICAgIC8vIGRpc2FibGUgc2Nyb2xsaW5nIG9mIHRoZSBwYWdlIHdoaWxlIG9wZW5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZVNjcm9sbGluZykge1xyXG4gICAgICB0aGlzLl9yZW5kZXJlclJlZi5hZGRDbGFzcyh0aGlzLl9kb2N1bWVudFJlZi5kb2N1bWVudEVsZW1lbnQsICdsYi1kaXNhYmxlLXNjcm9sbGluZycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYWRkQ3NzQW5pbWF0aW9uIGFkZCBjc3MzIGNsYXNzZXMgZm9yIGFuaW1hdGUgbGlnaHRib3hcclxuICAgKi9cclxuICBwcml2YXRlIF9hZGRDc3NBbmltYXRpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCByZXNpemVEdXJhdGlvbiA9IHRoaXMub3B0aW9ucy5yZXNpemVEdXJhdGlvbjtcclxuICAgIGNvbnN0IGZhZGVEdXJhdGlvbiA9IHRoaXMub3B0aW9ucy5mYWRlRHVyYXRpb247XHJcblxyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fbGlnaHRib3hFbGVtLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICctd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbicsIGAke2ZhZGVEdXJhdGlvbn1zYCk7XHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9saWdodGJveEVsZW0ubmF0aXZlRWxlbWVudCxcclxuICAgICAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsIGAke2ZhZGVEdXJhdGlvbn1zYCk7XHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9vdXRlckNvbnRhaW5lckVsZW0ubmF0aXZlRWxlbWVudCxcclxuICAgICAgJy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbicsIGAke3Jlc2l6ZUR1cmF0aW9ufXNgKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKHRoaXMuX291dGVyQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbicsIGAke3Jlc2l6ZUR1cmF0aW9ufXNgKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKHRoaXMuX2RhdGFDb250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICctd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbicsIGAke2ZhZGVEdXJhdGlvbn1zYCk7XHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9kYXRhQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnYW5pbWF0aW9uLWR1cmF0aW9uJywgYCR7ZmFkZUR1cmF0aW9ufXNgKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKCh0aGlzLl9pbWFnZUVsZW0gfHwgdGhpcy5faWZyYW1lRWxlbSkubmF0aXZlRWxlbWVudCxcclxuICAgICAgJy13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uJywgYCR7ZmFkZUR1cmF0aW9ufXNgKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKCh0aGlzLl9pbWFnZUVsZW0gfHwgdGhpcy5faWZyYW1lRWxlbSkubmF0aXZlRWxlbWVudCxcclxuICAgICAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsIGAke2ZhZGVEdXJhdGlvbn1zYCk7XHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9jYXB0aW9uRWxlbS5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb24nLCBgJHtmYWRlRHVyYXRpb259c2ApO1xyXG4gICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fY2FwdGlvbkVsZW0ubmF0aXZlRWxlbWVudCxcclxuICAgICAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsIGAke2ZhZGVEdXJhdGlvbn1zYCk7XHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9udW1iZXJFbGVtLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICctd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbicsIGAke2ZhZGVEdXJhdGlvbn1zYCk7XHJcbiAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9udW1iZXJFbGVtLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICdhbmltYXRpb24tZHVyYXRpb24nLCBgJHtmYWRlRHVyYXRpb259c2ApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy51aS5jbGFzc0xpc3QgPSAnbGlnaHRib3ggYW5pbWF0aW9uIGZhZGVPdXQnO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlU2Nyb2xsaW5nKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyUmVmLnJlbW92ZUNsYXNzKHRoaXMuX2RvY3VtZW50UmVmLmRvY3VtZW50RWxlbWVudCwgJ2xiLWRpc2FibGUtc2Nyb2xsaW5nJyk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jbXBSZWYuZGVzdHJveSgpO1xyXG4gICAgfSwgdGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiAqIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlRGV0YWlscygpOiB2b2lkIHtcclxuICAgIC8vIHVwZGF0ZSB0aGUgY2FwdGlvblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmFsYnVtW3RoaXMuY3VycmVudEltYWdlSW5kZXhdLmNhcHRpb24gIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgIHRoaXMuYWxidW1bdGhpcy5jdXJyZW50SW1hZ2VJbmRleF0uY2FwdGlvbiAhPT0gJycpIHtcclxuICAgICAgdGhpcy51aS5zaG93Q2FwdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBwYWdlIG51bWJlciBpZiB1c2VyIGNob29zZSB0byBkbyBzb1xyXG4gICAgLy8gZG9lcyBub3QgcGVyZm9ybSBudW1iZXJpbmcgdGhlIHBhZ2UgaWYgdGhlXHJcbiAgICAvLyBhcnJheSBsZW5ndGggaW4gYWxidW0gPD0gMVxyXG4gICAgaWYgKHRoaXMuYWxidW0ubGVuZ3RoID4gMSAmJiB0aGlzLm9wdGlvbnMuc2hvd0ltYWdlTnVtYmVyTGFiZWwpIHtcclxuICAgICAgdGhpcy51aS5zaG93UGFnZU51bWJlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuY29udGVudC5wYWdlTnVtYmVyID0gdGhpcy5fYWxidW1MYWJlbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWxidW1MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgLy8gZHVlIHRvIHt0aGlzLmN1cnJlbnRJbWFnZUluZGV4fSBpcyBzZXQgZnJvbSAwIHRvIHt0aGlzLmFsYnVtLmxlbmd0aH0gLSAxXHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsYnVtTGFiZWwucmVwbGFjZSgvJTEvZywgTnVtYmVyKHRoaXMuY3VycmVudEltYWdlSW5kZXggKyAxKSkucmVwbGFjZSgvJTIvZywgdGhpcy5hbGJ1bS5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2hhbmdlSW1hZ2UobmV3SW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVzZXRJbWFnZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IG5ld0luZGV4O1xyXG4gICAgdGhpcy5faGlkZUltYWdlKCk7XHJcbiAgICB0aGlzLl9yZWdpc3RlckltYWdlTG9hZGluZ0V2ZW50KCk7XHJcbiAgICB0aGlzLl9saWdodGJveEV2ZW50LmJyb2FkY2FzdExpZ2h0Ym94RXZlbnQoeyBpZDogTElHSFRCT1hfRVZFTlQuQ0hBTkdFX1BBR0UsIGRhdGE6IG5ld0luZGV4IH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGlkZUltYWdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy51aS5zaG93UmVsb2FkZXIgPSB0cnVlO1xyXG4gICAgdGhpcy51aS5zaG93QXJyb3dOYXYgPSBmYWxzZTtcclxuICAgIHRoaXMudWkuc2hvd0xlZnRBcnJvdyA9IGZhbHNlO1xyXG4gICAgdGhpcy51aS5zaG93UmlnaHRBcnJvdyA9IGZhbHNlO1xyXG4gICAgdGhpcy51aS5zaG93UGFnZU51bWJlciA9IGZhbHNlO1xyXG4gICAgdGhpcy51aS5zaG93Q2FwdGlvbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlTmF2KCk6IHZvaWQge1xyXG4gICAgbGV0IGFsd2F5c1Nob3dOYXYgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBjaGVjayB0byBzZWUgdGhlIGJyb3dzZXIgc3VwcG9ydCB0b3VjaCBldmVudFxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fZG9jdW1lbnRSZWYuY3JlYXRlRXZlbnQoJ1RvdWNoRXZlbnQnKTtcclxuICAgICAgYWx3YXlzU2hvd05hdiA9ICh0aGlzLm9wdGlvbnMuYWx3YXlzU2hvd05hdk9uVG91Y2hEZXZpY2VzKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gbm9vcFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGluaXRpYWxseSBzaG93IHRoZSBhcnJvdyBuYXZcclxuICAgIC8vIHdoaWNoIGlzIHRoZSBwYXJlbnQgb2YgYm90aCBsZWZ0IGFuZCByaWdodCBuYXZcclxuICAgIHRoaXMuX3Nob3dBcnJvd05hdigpO1xyXG4gICAgaWYgKHRoaXMuYWxidW0ubGVuZ3RoID4gMSkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLndyYXBBcm91bmQpIHtcclxuICAgICAgICBpZiAoYWx3YXlzU2hvd05hdikge1xyXG4gICAgICAgICAgLy8gYWx0ZXJuYXRpdmVzIHRoaXMuJGxpZ2h0Ym94LmZpbmQoJy5sYi1wcmV2LCAubGItbmV4dCcpLmNzcygnb3BhY2l0eScsICcxJyk7XHJcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9sZWZ0QXJyb3dFbGVtLm5hdGl2ZUVsZW1lbnQsICdvcGFjaXR5JywgJzEnKTtcclxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyUmVmLnNldFN0eWxlKHRoaXMuX3JpZ2h0QXJyb3dFbGVtLm5hdGl2ZUVsZW1lbnQsICdvcGFjaXR5JywgJzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFsdGVybmF0aXZlcyB0aGlzLiRsaWdodGJveC5maW5kKCcubGItcHJldiwgLmxiLW5leHQnKS5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5fc2hvd0xlZnRBcnJvd05hdigpO1xyXG4gICAgICAgIHRoaXMuX3Nob3dSaWdodEFycm93TmF2KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEltYWdlSW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAvLyBhbHRlcm5hdGl2ZXMgdGhpcy4kbGlnaHRib3guZmluZCgnLmxiLXByZXYnKS5zaG93KCk7XHJcbiAgICAgICAgICB0aGlzLl9zaG93TGVmdEFycm93TmF2KCk7XHJcbiAgICAgICAgICBpZiAoYWx3YXlzU2hvd05hdikge1xyXG4gICAgICAgICAgICAvLyBhbHRlcm5hdGl2ZXMgdGhpcy4kbGlnaHRib3guZmluZCgnLmxiLXByZXYnKS5jc3MoJ29wYWNpdHknLCAnMScpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlclJlZi5zZXRTdHlsZSh0aGlzLl9sZWZ0QXJyb3dFbGVtLm5hdGl2ZUVsZW1lbnQsICdvcGFjaXR5JywgJzEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZUluZGV4IDwgdGhpcy5hbGJ1bS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAvLyBhbHRlcm5hdGl2ZXMgdGhpcy4kbGlnaHRib3guZmluZCgnLmxiLW5leHQnKS5zaG93KCk7XHJcbiAgICAgICAgICB0aGlzLl9zaG93UmlnaHRBcnJvd05hdigpO1xyXG4gICAgICAgICAgaWYgKGFsd2F5c1Nob3dOYXYpIHtcclxuICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmVzIHRoaXMuJGxpZ2h0Ym94LmZpbmQoJy5sYi1uZXh0JykuY3NzKCdvcGFjaXR5JywgJzEnKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXJSZWYuc2V0U3R5bGUodGhpcy5fcmlnaHRBcnJvd0VsZW0ubmF0aXZlRWxlbWVudCwgJ29wYWNpdHknLCAnMScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2hvd0xlZnRBcnJvd05hdigpOiB2b2lkIHtcclxuICAgIHRoaXMudWkuc2hvd0xlZnRBcnJvdyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93UmlnaHRBcnJvd05hdigpOiB2b2lkIHtcclxuICAgIHRoaXMudWkuc2hvd1JpZ2h0QXJyb3cgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2hvd0Fycm93TmF2KCk6IHZvaWQge1xyXG4gICAgdGhpcy51aS5zaG93QXJyb3dOYXYgPSAodGhpcy5hbGJ1bS5sZW5ndGggIT09IDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW5hYmxlS2V5Ym9hcmROYXYoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ldmVudC5rZXl1cCA9IHRoaXMuX3JlbmRlcmVyUmVmLmxpc3RlbignZG9jdW1lbnQnLCAna2V5dXAnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLl9rZXlib2FyZEFjdGlvbihldmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc2FibGVLZXlib2FyZE5hdigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9ldmVudC5rZXl1cCkge1xyXG4gICAgICB0aGlzLl9ldmVudC5rZXl1cCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfa2V5Ym9hcmRBY3Rpb24oJGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IEtFWUNPREVfRVNDID0gMjc7XHJcbiAgICBjb25zdCBLRVlDT0RFX0xFRlRBUlJPVyA9IDM3O1xyXG4gICAgY29uc3QgS0VZQ09ERV9SSUdIVEFSUk9XID0gMzk7XHJcbiAgICBjb25zdCBrZXljb2RlID0gJGV2ZW50LmtleUNvZGU7XHJcbiAgICBjb25zdCBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleWNvZGUpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKGtleWNvZGUgPT09IEtFWUNPREVfRVNDIHx8IGtleS5tYXRjaCgveHxvfGMvKSkge1xyXG4gICAgICB0aGlzLl9saWdodGJveEV2ZW50LmJyb2FkY2FzdExpZ2h0Ym94RXZlbnQoeyBpZDogTElHSFRCT1hfRVZFTlQuQ0xPU0UsIGRhdGE6IG51bGwgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3AnIHx8IGtleWNvZGUgPT09IEtFWUNPREVfTEVGVEFSUk9XKSB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZUluZGV4ICE9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlSW1hZ2UodGhpcy5jdXJyZW50SW1hZ2VJbmRleCAtIDEpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICYmIHRoaXMuYWxidW0ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZUltYWdlKHRoaXMuYWxidW0ubGVuZ3RoIC0gMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbicgfHwga2V5Y29kZSA9PT0gS0VZQ09ERV9SSUdIVEFSUk9XKSB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZUluZGV4ICE9PSB0aGlzLmFsYnVtLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICB0aGlzLl9jaGFuZ2VJbWFnZSh0aGlzLmN1cnJlbnRJbWFnZUluZGV4ICsgMSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgdGhpcy5hbGJ1bS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlSW1hZ2UoMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldENzc1N0eWxlVmFsdWUoZWxlbTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLl93aW5kb3dSZWZcclxuICAgICAgLmdldENvbXB1dGVkU3R5bGUoZWxlbS5uYXRpdmVFbGVtZW50LCBudWxsKVxyXG4gICAgICAuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uUmVjZWl2ZWRFdmVudChldmVudDogSUV2ZW50KTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmlkKSB7XHJcbiAgICAgIGNhc2UgTElHSFRCT1hfRVZFTlQuQ0xPU0U6XHJcbiAgICAgICAgdGhpcy5fZW5kKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmVlZHNJZnJhbWUoc3JjOiBzdHJpbmcpIHtcclxuICAgIC8vIGNvbnN0IHNhbml0aXplZFVybCA9IHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuVVJMLCBzcmMpO1xyXG4gICAgaWYgKHNyYy5tYXRjaCgvXFwucGRmJC8pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibGItb3V0ZXJDb250YWluZXIgdHJhbnNpdGlvblwiICNvdXRlckNvbnRhaW5lciBpZD1cIm91dGVyQ29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGItY29udGFpbmVyXCIgI2NvbnRhaW5lciBpZD1cImNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJsYi1pbWFnZVwiIGlkPVwiaW1hZ2VcIiBbc3JjXT1cImFsYnVtW2N1cnJlbnRJbWFnZUluZGV4XS5zcmNcIiBjbGFzcz1cImxiLWltYWdlIGFuaW1hdGlvbiBmYWRlSW5cIlxyXG4gICAgICAgICAgICBbaGlkZGVuXT1cInVpLnNob3dSZWxvYWRlclwiICNpbWFnZVxyXG4gICAgICAgICAgICAqbmdJZj1cIiFhbGJ1bVtjdXJyZW50SW1hZ2VJbmRleF0uaWZyYW1lICYmICFuZWVkc0lmcmFtZShhbGJ1bVtjdXJyZW50SW1hZ2VJbmRleF0uc3JjKVwiPlxyXG4gICAgICAgIDxpZnJhbWUgY2xhc3M9XCJsYi1pbWFnZVwiIGlkPVwiaWZyYW1lXCIgW3NyY109XCJhbGJ1bVtjdXJyZW50SW1hZ2VJbmRleF0uc3JjIHwgc2FmZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGItaW1hZ2UgbGItaWZyYW1lIGFuaW1hdGlvbiBmYWRlSW5cIiBbaGlkZGVuXT1cInVpLnNob3dSZWxvYWRlclwiICNpZnJhbWVcclxuICAgICAgICAgICAgKm5nSWY9XCJhbGJ1bVtjdXJyZW50SW1hZ2VJbmRleF0uaWZyYW1lIHx8IG5lZWRzSWZyYW1lKGFsYnVtW2N1cnJlbnRJbWFnZUluZGV4XS5zcmMpXCI+XHJcbiAgICAgICAgPC9pZnJhbWU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxiLW5hdlwiIFtoaWRkZW5dPVwiIXVpLnNob3dBcnJvd05hdlwiICNuYXZBcnJvdz5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJsYi1wcmV2XCIgW2hpZGRlbl09XCIhdWkuc2hvd0xlZnRBcnJvd1wiIChjbGljayk9XCJwcmV2SW1hZ2UoKVwiICNsZWZ0QXJyb3c+PC9hPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImxiLW5leHRcIiBbaGlkZGVuXT1cIiF1aS5zaG93UmlnaHRBcnJvd1wiIChjbGljayk9XCJuZXh0SW1hZ2UoKVwiICNyaWdodEFycm93PjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGItbG9hZGVyXCIgW2hpZGRlbl09XCIhdWkuc2hvd1JlbG9hZGVyXCIgKGNsaWNrKT1cImNsb3NlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJsYi1jYW5jZWxcIj48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJsYi1kYXRhQ29udGFpbmVyXCIgW2hpZGRlbl09XCJ1aS5zaG93UmVsb2FkZXJcIiAjZGF0YUNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYi1kYXRhXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxiLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYi1jYXB0aW9uIGFuaW1hdGlvbiBmYWRlSW5cIiBbaGlkZGVuXT1cIiF1aS5zaG93Q2FwdGlvblwiXHJcbiAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImFsYnVtW2N1cnJlbnRJbWFnZUluZGV4XS5jYXB0aW9uXCIgI2NhcHRpb24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYi1udW1iZXIgYW5pbWF0aW9uIGZhZGVJblwiIFtoaWRkZW5dPVwiIXVpLnNob3dQYWdlTnVtYmVyXCIgI251bWJlcj57eyBjb250ZW50LnBhZ2VOdW1iZXJcclxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYi1jb250cm9sQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYi1jbG9zZUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJsYi1jbG9zZVwiIChjbGljayk9XCJjbG9zZSgkZXZlbnQpXCI+PC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxiLXR1cm5Db250YWluZXJcIiBbaGlkZGVuXT1cIiF1aS5zaG93Um90YXRlQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxiLXR1cm5MZWZ0XCIgKGNsaWNrKT1cImNvbnRyb2woJGV2ZW50KVwiPjwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGItdHVyblJpZ2h0XCIgKGNsaWNrKT1cImNvbnRyb2woJGV2ZW50KVwiPjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYi16b29tQ29udGFpbmVyXCIgW2hpZGRlbl09XCIhdWkuc2hvd1pvb21CdXR0b25cIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGItem9vbU91dFwiIChjbGljayk9XCJjb250cm9sKCRldmVudClcIj48L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxiLXpvb21JblwiIChjbGljayk9XCJjb250cm9sKCRldmVudClcIj48L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ== \ No newline at end of file diff --git a/esm2020/lib/lightbox.module.mjs b/esm2020/lib/lightbox.module.mjs new file mode 100644 index 0000000..a14ab94 --- /dev/null +++ b/esm2020/lib/lightbox.module.mjs @@ -0,0 +1,32 @@ +import { Lightbox } from './lightbox.service'; +import { LightboxComponent, SafePipe } from './lightbox.component'; +import { LightboxConfig } from './lightbox-config.service'; +import { LightboxEvent, LightboxWindowRef } from './lightbox-event.service'; +import { LightboxOverlayComponent } from './lightbox-overlay.component'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import * as i0 from "@angular/core"; +export class LightboxModule { +} +LightboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); +LightboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe], imports: [CommonModule] }); +LightboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, providers: [ + Lightbox, + LightboxConfig, + LightboxEvent, + LightboxWindowRef + ], imports: [[CommonModule]] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, decorators: [{ + type: NgModule, + args: [{ + imports: [CommonModule], + declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe], + providers: [ + Lightbox, + LightboxConfig, + LightboxEvent, + LightboxWindowRef + ] + }] + }] }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWxpZ2h0Ym94L3NyYy9saWIvbGlnaHRib3gubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7QUFZN0MsTUFBTSxPQUFPLGNBQWM7OzRHQUFkLGNBQWM7NkdBQWQsY0FBYyxpQkFSUix3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLGFBRDFELFlBQVk7NkdBU2IsY0FBYyxhQVBaO1FBQ1AsUUFBUTtRQUNSLGNBQWM7UUFDZCxhQUFhO1FBQ2IsaUJBQWlCO0tBQ3BCLFlBUFEsQ0FBQyxZQUFZLENBQUM7NEZBU2QsY0FBYztrQkFWMUIsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFlBQVksRUFBRSxDQUFDLHdCQUF3QixFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQztvQkFDckUsU0FBUyxFQUFFO3dCQUNQLFFBQVE7d0JBQ1IsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGlCQUFpQjtxQkFDcEI7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaWdodGJveCB9IGZyb20gJy4vbGlnaHRib3guc2VydmljZSc7XHJcbmltcG9ydCB7TGlnaHRib3hDb21wb25lbnQsIFNhZmVQaXBlfSBmcm9tICcuL2xpZ2h0Ym94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExpZ2h0Ym94Q29uZmlnIH0gZnJvbSAnLi9saWdodGJveC1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IExpZ2h0Ym94RXZlbnQsIExpZ2h0Ym94V2luZG93UmVmIH0gZnJvbSAnLi9saWdodGJveC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlnaHRib3hPdmVybGF5Q29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gICAgZGVjbGFyYXRpb25zOiBbTGlnaHRib3hPdmVybGF5Q29tcG9uZW50LCBMaWdodGJveENvbXBvbmVudCwgU2FmZVBpcGVdLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTGlnaHRib3gsXHJcbiAgICAgICAgTGlnaHRib3hDb25maWcsXHJcbiAgICAgICAgTGlnaHRib3hFdmVudCxcclxuICAgICAgICBMaWdodGJveFdpbmRvd1JlZlxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGlnaHRib3hNb2R1bGUgeyB9XHJcbiJdfQ== \ No newline at end of file diff --git a/esm2020/lib/lightbox.service.mjs b/esm2020/lib/lightbox.service.mjs new file mode 100644 index 0000000..d987c21 --- /dev/null +++ b/esm2020/lib/lightbox.service.mjs @@ -0,0 +1,72 @@ +import { Inject, Injectable } from '@angular/core'; +import { LightboxComponent } from './lightbox.component'; +import { LIGHTBOX_EVENT } from './lightbox-event.service'; +import { LightboxOverlayComponent } from './lightbox-overlay.component'; +import { DOCUMENT } from '@angular/common'; +import * as i0 from "@angular/core"; +import * as i1 from "./lightbox-config.service"; +import * as i2 from "./lightbox-event.service"; +export class Lightbox { + constructor(_componentFactoryResolver, _injector, _applicationRef, _lightboxConfig, _lightboxEvent, _documentRef) { + this._componentFactoryResolver = _componentFactoryResolver; + this._injector = _injector; + this._applicationRef = _applicationRef; + this._lightboxConfig = _lightboxConfig; + this._lightboxEvent = _lightboxEvent; + this._documentRef = _documentRef; + } + open(album, curIndex = 0, options = {}) { + const overlayComponentRef = this._createComponent(LightboxOverlayComponent); + const componentRef = this._createComponent(LightboxComponent); + const newOptions = {}; + // broadcast open event + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.OPEN }); + Object.assign(newOptions, this._lightboxConfig, options); + // attach input to lightbox + componentRef.instance.album = album; + componentRef.instance.currentImageIndex = curIndex; + componentRef.instance.options = newOptions; + componentRef.instance.cmpRef = componentRef; + // attach input to overlay + overlayComponentRef.instance.options = newOptions; + overlayComponentRef.instance.cmpRef = overlayComponentRef; + // FIXME: not sure why last event is broadcasted (which is CLOSED) and make + // lightbox can not be opened the second time. + // Need to timeout so that the OPEN event is set before component is initialized + setTimeout(() => { + this._applicationRef.attachView(overlayComponentRef.hostView); + this._applicationRef.attachView(componentRef.hostView); + overlayComponentRef.onDestroy(() => { + this._applicationRef.detachView(overlayComponentRef.hostView); + }); + componentRef.onDestroy(() => { + this._applicationRef.detachView(componentRef.hostView); + }); + const containerElement = newOptions.containerElementResolver(this._documentRef); + containerElement.appendChild(overlayComponentRef.location.nativeElement); + containerElement.appendChild(componentRef.location.nativeElement); + }); + } + close() { + if (this._lightboxEvent) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE }); + } + } + _createComponent(ComponentClass) { + const factory = this._componentFactoryResolver.resolveComponentFactory(ComponentClass); + const component = factory.create(this._injector); + return component; + } +} +Lightbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: i1.LightboxConfig }, { token: i2.LightboxEvent }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); +Lightbox.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: i1.LightboxConfig }, { type: i2.LightboxEvent }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWdodGJveC9zcmMvbGliL2xpZ2h0Ym94LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLE1BQU0sRUFDTixVQUFVLEVBRVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekQsT0FBTyxFQUFpQixjQUFjLEVBQVUsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFLM0MsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFDVSx5QkFBbUQsRUFDbkQsU0FBbUIsRUFDbkIsZUFBK0IsRUFDL0IsZUFBK0IsRUFDL0IsY0FBNkIsRUFDWCxZQUFZO1FBTDlCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0Isb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQ1gsaUJBQVksR0FBWixZQUFZLENBQUE7SUFDcEMsQ0FBQztJQUVMLElBQUksQ0FBQyxLQUFvQixFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUFDbkQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RCxNQUFNLFVBQVUsR0FBNEIsRUFBRSxDQUFDO1FBRS9DLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsRUFBRSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFekQsMkJBQTJCO1FBQzNCLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQyxZQUFZLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztRQUNuRCxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDM0MsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRTVDLDBCQUEwQjtRQUMxQixtQkFBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUNsRCxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDO1FBRTFELDJFQUEyRTtRQUMzRSw4Q0FBOEM7UUFDOUMsZ0ZBQWdGO1FBQ2hGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkQsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hGLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsRUFBRSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLGNBQW1CO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOztzR0EzRFUsUUFBUSwyS0FPVCxRQUFROzBHQVBQLFFBQVEsY0FGUCxNQUFNOzRGQUVQLFFBQVE7a0JBSHBCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRSSxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgSW5qZWN0LFxyXG4gIEluamVjdGFibGUsXHJcbiAgSW5qZWN0b3JcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTGlnaHRib3hDb21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExpZ2h0Ym94Q29uZmlnIH0gZnJvbSAnLi9saWdodGJveC1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IExpZ2h0Ym94RXZlbnQsIExJR0hUQk9YX0VWRU5ULCBJQWxidW0gfSBmcm9tICcuL2xpZ2h0Ym94LWV2ZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMaWdodGJveE92ZXJsYXlDb21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LW92ZXJsYXkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGlnaHRib3gge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIF9hcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWYsXHJcbiAgICBwcml2YXRlIF9saWdodGJveENvbmZpZzogTGlnaHRib3hDb25maWcsXHJcbiAgICBwcml2YXRlIF9saWdodGJveEV2ZW50OiBMaWdodGJveEV2ZW50LFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnRSZWZcclxuICApIHsgfVxyXG5cclxuICBvcGVuKGFsYnVtOiBBcnJheTxJQWxidW0+LCBjdXJJbmRleCA9IDAsIG9wdGlvbnMgPSB7fSk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3ZlcmxheUNvbXBvbmVudFJlZiA9IHRoaXMuX2NyZWF0ZUNvbXBvbmVudChMaWdodGJveE92ZXJsYXlDb21wb25lbnQpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5fY3JlYXRlQ29tcG9uZW50KExpZ2h0Ym94Q29tcG9uZW50KTtcclxuICAgIGNvbnN0IG5ld09wdGlvbnM6IFBhcnRpYWw8TGlnaHRib3hDb25maWc+ID0ge307XHJcblxyXG4gICAgLy8gYnJvYWRjYXN0IG9wZW4gZXZlbnRcclxuICAgIHRoaXMuX2xpZ2h0Ym94RXZlbnQuYnJvYWRjYXN0TGlnaHRib3hFdmVudCh7IGlkOiBMSUdIVEJPWF9FVkVOVC5PUEVOIH0pO1xyXG4gICAgT2JqZWN0LmFzc2lnbihuZXdPcHRpb25zLCB0aGlzLl9saWdodGJveENvbmZpZywgb3B0aW9ucyk7XHJcblxyXG4gICAgLy8gYXR0YWNoIGlucHV0IHRvIGxpZ2h0Ym94XHJcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuYWxidW0gPSBhbGJ1bTtcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jdXJyZW50SW1hZ2VJbmRleCA9IGN1ckluZGV4O1xyXG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLm9wdGlvbnMgPSBuZXdPcHRpb25zO1xyXG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNtcFJlZiA9IGNvbXBvbmVudFJlZjtcclxuXHJcbiAgICAvLyBhdHRhY2ggaW5wdXQgdG8gb3ZlcmxheVxyXG4gICAgb3ZlcmxheUNvbXBvbmVudFJlZi5pbnN0YW5jZS5vcHRpb25zID0gbmV3T3B0aW9ucztcclxuICAgIG92ZXJsYXlDb21wb25lbnRSZWYuaW5zdGFuY2UuY21wUmVmID0gb3ZlcmxheUNvbXBvbmVudFJlZjtcclxuXHJcbiAgICAvLyBGSVhNRTogbm90IHN1cmUgd2h5IGxhc3QgZXZlbnQgaXMgYnJvYWRjYXN0ZWQgKHdoaWNoIGlzIENMT1NFRCkgYW5kIG1ha2VcclxuICAgIC8vIGxpZ2h0Ym94IGNhbiBub3QgYmUgb3BlbmVkIHRoZSBzZWNvbmQgdGltZS5cclxuICAgIC8vIE5lZWQgdG8gdGltZW91dCBzbyB0aGF0IHRoZSBPUEVOIGV2ZW50IGlzIHNldCBiZWZvcmUgY29tcG9uZW50IGlzIGluaXRpYWxpemVkXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyhvdmVybGF5Q29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgICAgdGhpcy5fYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICBvdmVybGF5Q29tcG9uZW50UmVmLm9uRGVzdHJveSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fYXBwbGljYXRpb25SZWYuZGV0YWNoVmlldyhvdmVybGF5Q29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbXBvbmVudFJlZi5vbkRlc3Ryb3koKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uUmVmLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gbmV3T3B0aW9ucy5jb250YWluZXJFbGVtZW50UmVzb2x2ZXIodGhpcy5fZG9jdW1lbnRSZWYpO1xyXG4gICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKG92ZXJsYXlDb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9saWdodGJveEV2ZW50KSB7XHJcbiAgICAgIHRoaXMuX2xpZ2h0Ym94RXZlbnQuYnJvYWRjYXN0TGlnaHRib3hFdmVudCh7IGlkOiBMSUdIVEJPWF9FVkVOVC5DTE9TRSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9jcmVhdGVDb21wb25lbnQoQ29tcG9uZW50Q2xhc3M6IGFueSk6IENvbXBvbmVudFJlZjxhbnk+IHtcclxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoQ29tcG9uZW50Q2xhc3MpO1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gZmFjdG9yeS5jcmVhdGUodGhpcy5faW5qZWN0b3IpO1xyXG5cclxuICAgIHJldHVybiBjb21wb25lbnQ7XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file diff --git a/esm2020/ngx-lightbox.mjs b/esm2020/ngx-lightbox.mjs new file mode 100644 index 0000000..23230b7 --- /dev/null +++ b/esm2020/ngx-lightbox.mjs @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +export * from './public-api'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWxpZ2h0Ym94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LWxpZ2h0Ym94L3NyYy9uZ3gtbGlnaHRib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ== \ No newline at end of file diff --git a/esm2020/public-api.mjs b/esm2020/public-api.mjs new file mode 100644 index 0000000..5e31d88 --- /dev/null +++ b/esm2020/public-api.mjs @@ -0,0 +1,5 @@ +export * from './lib/lightbox.service'; +export * from './lib/lightbox-config.service'; +export * from './lib/lightbox-event.service'; +export * from './lib/lightbox.module'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1saWdodGJveC9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvbGlnaHRib3guc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xpZ2h0Ym94LWNvbmZpZy5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbGlnaHRib3gtZXZlbnQuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xpZ2h0Ym94Lm1vZHVsZSc7XHJcbiJdfQ== \ No newline at end of file diff --git a/fesm2015/ngx-lightbox.mjs b/fesm2015/ngx-lightbox.mjs new file mode 100644 index 0000000..b9c98e7 --- /dev/null +++ b/fesm2015/ngx-lightbox.mjs @@ -0,0 +1,863 @@ +import * as i0 from '@angular/core'; +import { Injectable, Pipe, SecurityContext, Component, Inject, Input, ViewChild, HostListener, NgModule } from '@angular/core'; +import * as i3 from '@angular/common'; +import { DOCUMENT, CommonModule } from '@angular/common'; +import { Subject } from 'rxjs'; +import * as i1 from '@angular/platform-browser'; + +const LIGHTBOX_EVENT = { + CHANGE_PAGE: 1, + CLOSE: 2, + OPEN: 3, + ZOOM_IN: 4, + ZOOM_OUT: 5, + ROTATE_LEFT: 6, + ROTATE_RIGHT: 7, + FILE_NOT_FOUND: 8 +}; +class LightboxEvent { + constructor() { + this._lightboxEventSource = new Subject(); + this.lightboxEvent$ = this._lightboxEventSource.asObservable(); + } + broadcastLightboxEvent(event) { + this._lightboxEventSource.next(event); + } +} +LightboxEvent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxEvent.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return []; } }); +function getWindow() { + return window; +} +class LightboxWindowRef { + get nativeWindow() { + return getWindow(); + } +} +LightboxWindowRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxWindowRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }] }); + +class SafePipe { + constructor(sanitizer) { + this.sanitizer = sanitizer; + } + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} +SafePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); +SafePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, name: "safe" }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, decorators: [{ + type: Pipe, + args: [{ name: 'safe' }] + }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } }); +class LightboxComponent { + constructor(_elemRef, _rendererRef, _lightboxEvent, _lightboxElem, _lightboxWindowRef, _sanitizer, _documentRef) { + this._elemRef = _elemRef; + this._rendererRef = _rendererRef; + this._lightboxEvent = _lightboxEvent; + this._lightboxElem = _lightboxElem; + this._lightboxWindowRef = _lightboxWindowRef; + this._sanitizer = _sanitizer; + this._documentRef = _documentRef; + // initialize data + this.options = this.options || {}; + this.album = this.album || []; + this.currentImageIndex = this.currentImageIndex || 0; + this._windowRef = this._lightboxWindowRef.nativeWindow; + // control the interactive of the directive + this.ui = { + // control the appear of the reloader + // false: image has loaded completely and ready to be shown + // true: image is still loading + showReloader: true, + // control the appear of the nav arrow + // the arrowNav is the parent of both left and right arrow + // in some cases, the parent shows but the child does not show + showLeftArrow: false, + showRightArrow: false, + showArrowNav: false, + // control the appear of the zoom and rotate buttons + showZoomButton: false, + showRotateButton: false, + // control whether to show the + // page number or not + showPageNumber: false, + showCaption: false, + classList: 'lightbox animation fadeIn' + }; + this.content = { + pageNumber: '' + }; + this._event = {}; + this._lightboxElem = this._elemRef; + this._event.subscription = this._lightboxEvent.lightboxEvent$ + .subscribe((event) => this._onReceivedEvent(event)); + this.rotate = 0; + } + ngOnInit() { + this.album.forEach(album => { + if (album.caption) { + album.caption = this._sanitizer.sanitize(SecurityContext.HTML, album.caption); + } + }); + } + ngAfterViewInit() { + // need to init css value here, after the view ready + // actually these values are always 0 + this._cssValue = { + containerTopPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-top')), + containerRightPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-right')), + containerBottomPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-bottom')), + containerLeftPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-left')), + imageBorderWidthTop: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-top-width')), + imageBorderWidthBottom: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-bottom-width')), + imageBorderWidthLeft: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-left-width')), + imageBorderWidthRight: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-right-width')) + }; + if (this._validateInputData()) { + this._prepareComponent(); + this._registerImageLoadingEvent(); + } + } + ngOnDestroy() { + if (!this.options.disableKeyboardNav) { + // unbind keyboard event + this._disableKeyboardNav(); + } + this._event.subscription.unsubscribe(); + } + close($event) { + $event.stopPropagation(); + if ($event.target.classList.contains('lightbox') || + $event.target.classList.contains('lb-loader') || + $event.target.classList.contains('lb-close')) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + } + control($event) { + $event.stopPropagation(); + let height; + let width; + if ($event.target.classList.contains('lb-turnLeft')) { + this.rotate = this.rotate - 90; + this._rotateContainer(); + this._calcTransformPoint(); + this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`; + this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_LEFT, data: null }); + } + else if ($event.target.classList.contains('lb-turnRight')) { + this.rotate = this.rotate + 90; + this._rotateContainer(); + this._calcTransformPoint(); + this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`; + this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_RIGHT, data: null }); + } + else if ($event.target.classList.contains('lb-zoomOut')) { + height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) / 1.5; + width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) / 1.5; + this._documentRef.getElementById('outerContainer').style.height = height + 'px'; + this._documentRef.getElementById('outerContainer').style.width = width + 'px'; + height = parseInt(this._documentRef.getElementById('image').style.height, 10) / 1.5; + width = parseInt(this._documentRef.getElementById('image').style.width, 10) / 1.5; + this._documentRef.getElementById('image').style.height = height + 'px'; + this._documentRef.getElementById('image').style.width = width + 'px'; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_OUT, data: null }); + } + else if ($event.target.classList.contains('lb-zoomIn')) { + height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) * 1.5; + width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) * 1.5; + this._documentRef.getElementById('outerContainer').style.height = height + 'px'; + this._documentRef.getElementById('outerContainer').style.width = width + 'px'; + height = parseInt(this._documentRef.getElementById('image').style.height, 10) * 1.5; + width = parseInt(this._documentRef.getElementById('image').style.width, 10) * 1.5; + this._documentRef.getElementById('image').style.height = height + 'px'; + this._documentRef.getElementById('image').style.width = width + 'px'; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_IN, data: null }); + } + } + _rotateContainer() { + let temp = this.rotate; + if (temp < 0) { + temp *= -1; + } + if (temp / 90 % 4 === 1 || temp / 90 % 4 === 3) { + this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.height; + this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height; + } + else { + this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.height; + this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height; + } + } + _resetImage() { + this.rotate = 0; + const image = this._documentRef.getElementById('image'); + if (image) { + image.style.transform = `rotate(${this.rotate}deg)`; + image.style.webkitTransform = `rotate(${this.rotate}deg)`; + } + } + _calcTransformPoint() { + let height = parseInt(this._documentRef.getElementById('image').style.height, 10); + let width = parseInt(this._documentRef.getElementById('image').style.width, 10); + let temp = this.rotate % 360; + if (temp < 0) { + temp = 360 + temp; + } + if (temp === 90) { + this._documentRef.getElementById('image').style.transformOrigin = (height / 2) + 'px ' + (height / 2) + 'px'; + } + else if (temp === 180) { + this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (height / 2) + 'px'; + } + else if (temp === 270) { + this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (width / 2) + 'px'; + } + } + nextImage() { + if (this.album.length === 1) { + return; + } + else if (this.currentImageIndex === this.album.length - 1) { + this._changeImage(0); + } + else { + this._changeImage(this.currentImageIndex + 1); + } + } + prevImage() { + if (this.album.length === 1) { + return; + } + else if (this.currentImageIndex === 0 && this.album.length > 1) { + this._changeImage(this.album.length - 1); + } + else { + this._changeImage(this.currentImageIndex - 1); + } + } + _validateInputData() { + if (this.album && + this.album instanceof Array && + this.album.length > 0) { + for (let i = 0; i < this.album.length; i++) { + // check whether each _nside + // album has src data or not + if (this.album[i].src) { + continue; + } + throw new Error('One of the album data does not have source data'); + } + } + else { + throw new Error('No album data or album data is not correct in type'); + } + // to prevent data understand as string + // convert it to number + if (isNaN(this.currentImageIndex)) { + throw new Error('Current image index is not a number'); + } + else { + this.currentImageIndex = Number(this.currentImageIndex); + } + return true; + } + _registerImageLoadingEvent() { + const src = this.album[this.currentImageIndex].src; + if (this.album[this.currentImageIndex].iframe || this.needsIframe(src)) { + setTimeout(() => { + this._onLoadImageSuccess(); + }); + return; + } + const preloader = new Image(); + preloader.onload = () => { + this._onLoadImageSuccess(); + }; + preloader.onerror = (e) => { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.FILE_NOT_FOUND, data: e }); + }; + preloader.src = this._sanitizer.sanitize(SecurityContext.URL, src); + } + /** + * Fire when the image is loaded + */ + _onLoadImageSuccess() { + if (!this.options.disableKeyboardNav) { + // unbind keyboard event during transition + this._disableKeyboardNav(); + } + let imageHeight; + let imageWidth; + let maxImageHeight; + let maxImageWidth; + let windowHeight; + let windowWidth; + let naturalImageWidth; + let naturalImageHeight; + // set default width and height of image to be its natural + imageWidth = naturalImageWidth = this._imageElem ? this._imageElem.nativeElement.naturalWidth : this._windowRef.innerWidth * .8; + imageHeight = naturalImageHeight = this._imageElem ? this._imageElem.nativeElement.naturalHeight : this._windowRef.innerHeight * .8; + if (this.options.fitImageInViewPort) { + windowWidth = this._windowRef.innerWidth; + windowHeight = this._windowRef.innerHeight; + maxImageWidth = windowWidth - this._cssValue.containerLeftPadding - + this._cssValue.containerRightPadding - this._cssValue.imageBorderWidthLeft - + this._cssValue.imageBorderWidthRight - 20; + maxImageHeight = windowHeight - this._cssValue.containerTopPadding - + this._cssValue.containerTopPadding - this._cssValue.imageBorderWidthTop - + this._cssValue.imageBorderWidthBottom - 120; + if (naturalImageWidth > maxImageWidth || naturalImageHeight > maxImageHeight) { + if ((naturalImageWidth / maxImageWidth) > (naturalImageHeight / maxImageHeight)) { + imageWidth = maxImageWidth; + imageHeight = Math.round(naturalImageHeight / (naturalImageWidth / imageWidth)); + } + else { + imageHeight = maxImageHeight; + imageWidth = Math.round(naturalImageWidth / (naturalImageHeight / imageHeight)); + } + } + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'width', `${imageWidth}px`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'height', `${imageHeight}px`); + } + this._sizeContainer(imageWidth, imageHeight); + if (this.options.centerVertically) { + this._centerVertically(imageWidth, imageHeight); + } + } + _centerVertically(imageWidth, imageHeight) { + const scrollOffset = this._documentRef.documentElement.scrollTop; + const windowHeight = this._windowRef.innerHeight; + const viewOffset = windowHeight / 2 - imageHeight / 2; + const topDistance = scrollOffset + viewOffset; + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${topDistance}px`); + } + _sizeContainer(imageWidth, imageHeight) { + const oldWidth = this._outerContainerElem.nativeElement.offsetWidth; + const oldHeight = this._outerContainerElem.nativeElement.offsetHeight; + const newWidth = imageWidth + this._cssValue.containerRightPadding + this._cssValue.containerLeftPadding + + this._cssValue.imageBorderWidthLeft + this._cssValue.imageBorderWidthRight; + const newHeight = imageHeight + this._cssValue.containerTopPadding + this._cssValue.containerBottomPadding + + this._cssValue.imageBorderWidthTop + this._cssValue.imageBorderWidthBottom; + // make sure that distances are large enough for transitionend event to be fired, at least 5px. + if (Math.abs(oldWidth - newWidth) + Math.abs(oldHeight - newHeight) > 5) { + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'width', `${newWidth}px`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'height', `${newHeight}px`); + // bind resize event to outer container + // use enableTransition to prevent infinite loader + if (this.options.enableTransition) { + this._event.transitions = []; + ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd', 'MSTransitionEnd'].forEach(eventName => { + this._event.transitions.push(this._rendererRef.listen(this._outerContainerElem.nativeElement, eventName, (event) => { + if (event.target === event.currentTarget) { + this._postResize(newWidth, newHeight); + } + })); + }); + } + else { + this._postResize(newWidth, newHeight); + } + } + else { + this._postResize(newWidth, newHeight); + } + } + _postResize(newWidth, newHeight) { + // unbind resize event + if (Array.isArray(this._event.transitions)) { + this._event.transitions.forEach((eventHandler) => { + eventHandler(); + }); + this._event.transitions = []; + } + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'width', `${newWidth}px`); + this._showImage(); + } + _showImage() { + this.ui.showReloader = false; + this._updateNav(); + this._updateDetails(); + if (!this.options.disableKeyboardNav) { + this._enableKeyboardNav(); + } + } + _prepareComponent() { + // add css3 animation + this._addCssAnimation(); + // position the image according to user's option + this._positionLightBox(); + // update controls visibility on next view generation + setTimeout(() => { + this.ui.showZoomButton = this.options.showZoom; + this.ui.showRotateButton = this.options.showRotate; + }, 0); + } + _positionLightBox() { + // @see https://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll + const top = (this._windowRef.pageYOffset || this._documentRef.documentElement.scrollTop) + + this.options.positionFromTop; + const left = this._windowRef.pageXOffset || this._documentRef.documentElement.scrollLeft; + if (!this.options.centerVertically) { + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${top}px`); + } + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'left', `${left}px`); + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'display', 'block'); + // disable scrolling of the page while open + if (this.options.disableScrolling) { + this._rendererRef.addClass(this._documentRef.documentElement, 'lb-disable-scrolling'); + } + } + /** + * addCssAnimation add css3 classes for animate lightbox + */ + _addCssAnimation() { + const resizeDuration = this.options.resizeDuration; + const fadeDuration = this.options.fadeDuration; + this._rendererRef.setStyle(this._lightboxElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, '-webkit-transition-duration', `${resizeDuration}s`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'transition-duration', `${resizeDuration}s`); + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._captionElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._captionElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._numberElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._numberElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + } + _end() { + this.ui.classList = 'lightbox animation fadeOut'; + if (this.options.disableScrolling) { + this._rendererRef.removeClass(this._documentRef.documentElement, 'lb-disable-scrolling'); + } + setTimeout(() => { + this.cmpRef.destroy(); + }, this.options.fadeDuration * 1000); + } + _updateDetails() { + // update the caption + if (typeof this.album[this.currentImageIndex].caption !== 'undefined' && + this.album[this.currentImageIndex].caption !== '') { + this.ui.showCaption = true; + } + // update the page number if user choose to do so + // does not perform numbering the page if the + // array length in album <= 1 + if (this.album.length > 1 && this.options.showImageNumberLabel) { + this.ui.showPageNumber = true; + this.content.pageNumber = this._albumLabel(); + } + } + _albumLabel() { + // due to {this.currentImageIndex} is set from 0 to {this.album.length} - 1 + return this.options.albumLabel.replace(/%1/g, Number(this.currentImageIndex + 1)).replace(/%2/g, this.album.length); + } + _changeImage(newIndex) { + this._resetImage(); + this.currentImageIndex = newIndex; + this._hideImage(); + this._registerImageLoadingEvent(); + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CHANGE_PAGE, data: newIndex }); + } + _hideImage() { + this.ui.showReloader = true; + this.ui.showArrowNav = false; + this.ui.showLeftArrow = false; + this.ui.showRightArrow = false; + this.ui.showPageNumber = false; + this.ui.showCaption = false; + } + _updateNav() { + let alwaysShowNav = false; + // check to see the browser support touch event + try { + this._documentRef.createEvent('TouchEvent'); + alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false; + } + catch (e) { + // noop + } + // initially show the arrow nav + // which is the parent of both left and right nav + this._showArrowNav(); + if (this.album.length > 1) { + if (this.options.wrapAround) { + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1'); + this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1'); + this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1'); + } + // alternatives this.$lightbox.find('.lb-prev, .lb-next').show(); + this._showLeftArrowNav(); + this._showRightArrowNav(); + } + else { + if (this.currentImageIndex > 0) { + // alternatives this.$lightbox.find('.lb-prev').show(); + this._showLeftArrowNav(); + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-prev').css('opacity', '1'); + this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1'); + } + } + if (this.currentImageIndex < this.album.length - 1) { + // alternatives this.$lightbox.find('.lb-next').show(); + this._showRightArrowNav(); + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-next').css('opacity', '1'); + this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1'); + } + } + } + } + } + _showLeftArrowNav() { + this.ui.showLeftArrow = true; + } + _showRightArrowNav() { + this.ui.showRightArrow = true; + } + _showArrowNav() { + this.ui.showArrowNav = (this.album.length !== 1); + } + _enableKeyboardNav() { + this._event.keyup = this._rendererRef.listen('document', 'keyup', (event) => { + this._keyboardAction(event); + }); + } + _disableKeyboardNav() { + if (this._event.keyup) { + this._event.keyup(); + } + } + _keyboardAction($event) { + const KEYCODE_ESC = 27; + const KEYCODE_LEFTARROW = 37; + const KEYCODE_RIGHTARROW = 39; + const keycode = $event.keyCode; + const key = String.fromCharCode(keycode).toLowerCase(); + if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + else if (key === 'p' || keycode === KEYCODE_LEFTARROW) { + if (this.currentImageIndex !== 0) { + this._changeImage(this.currentImageIndex - 1); + } + else if (this.options.wrapAround && this.album.length > 1) { + this._changeImage(this.album.length - 1); + } + } + else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) { + if (this.currentImageIndex !== this.album.length - 1) { + this._changeImage(this.currentImageIndex + 1); + } + else if (this.options.wrapAround && this.album.length > 1) { + this._changeImage(0); + } + } + } + _getCssStyleValue(elem, propertyName) { + return parseFloat(this._windowRef + .getComputedStyle(elem.nativeElement, null) + .getPropertyValue(propertyName)); + } + _onReceivedEvent(event) { + switch (event.id) { + case LIGHTBOX_EVENT.CLOSE: + this._end(); + break; + default: + break; + } + } + needsIframe(src) { + // const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, src); + if (src.match(/\.pdf$/)) { + return true; + } + return false; + } +} +LightboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: LightboxEvent }, { token: i0.ElementRef }, { token: LightboxWindowRef }, { token: i1.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); +LightboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: LightboxComponent, selector: "[lb-content]", inputs: { album: "album", currentImageIndex: "currentImageIndex", options: "options", cmpRef: "cmpRef" }, host: { listeners: { "close": "close($event)" }, properties: { "class": "ui.classList" } }, viewQueries: [{ propertyName: "_outerContainerElem", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "_containerElem", first: true, predicate: ["container"], descendants: true }, { propertyName: "_leftArrowElem", first: true, predicate: ["leftArrow"], descendants: true }, { propertyName: "_rightArrowElem", first: true, predicate: ["rightArrow"], descendants: true }, { propertyName: "_navArrowElem", first: true, predicate: ["navArrow"], descendants: true }, { propertyName: "_dataContainerElem", first: true, predicate: ["dataContainer"], descendants: true }, { propertyName: "_imageElem", first: true, predicate: ["image"], descendants: true }, { propertyName: "_iframeElem", first: true, predicate: ["iframe"], descendants: true }, { propertyName: "_captionElem", first: true, predicate: ["caption"], descendants: true }, { propertyName: "_numberElem", first: true, predicate: ["number"], descendants: true }], ngImport: i0, template: "
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
", directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "safe": SafePipe } }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxComponent, decorators: [{ + type: Component, + args: [{ selector: '[lb-content]', host: { + '[class]': 'ui.classList' + }, template: "
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
" }] + }], ctorParameters: function () { + return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: LightboxEvent }, { type: i0.ElementRef }, { type: LightboxWindowRef }, { type: i1.DomSanitizer }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; + }, propDecorators: { album: [{ + type: Input + }], currentImageIndex: [{ + type: Input + }], options: [{ + type: Input + }], cmpRef: [{ + type: Input + }], _outerContainerElem: [{ + type: ViewChild, + args: ['outerContainer'] + }], _containerElem: [{ + type: ViewChild, + args: ['container'] + }], _leftArrowElem: [{ + type: ViewChild, + args: ['leftArrow'] + }], _rightArrowElem: [{ + type: ViewChild, + args: ['rightArrow'] + }], _navArrowElem: [{ + type: ViewChild, + args: ['navArrow'] + }], _dataContainerElem: [{ + type: ViewChild, + args: ['dataContainer'] + }], _imageElem: [{ + type: ViewChild, + args: ['image'] + }], _iframeElem: [{ + type: ViewChild, + args: ['iframe'] + }], _captionElem: [{ + type: ViewChild, + args: ['caption'] + }], _numberElem: [{ + type: ViewChild, + args: ['number'] + }], close: [{ + type: HostListener, + args: ['close', ['$event']] + }] } }); + +class LightboxOverlayComponent { + constructor(_elemRef, _rendererRef, _lightboxEvent, _documentRef) { + this._elemRef = _elemRef; + this._rendererRef = _rendererRef; + this._lightboxEvent = _lightboxEvent; + this._documentRef = _documentRef; + this.classList = 'lightboxOverlay animation fadeInOverlay'; + this._subscription = this._lightboxEvent.lightboxEvent$.subscribe((event) => this._onReceivedEvent(event)); + } + close() { + // broadcast to itself and all others subscriber including the components + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + ngAfterViewInit() { + const fadeDuration = this.options.fadeDuration; + this._rendererRef.setStyle(this._elemRef.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._sizeOverlay(); + } + onResize() { + this._sizeOverlay(); + } + ngOnDestroy() { + this._subscription.unsubscribe(); + } + _sizeOverlay() { + const width = this._getOverlayWidth(); + const height = this._getOverlayHeight(); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'width', `${width}px`); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'height', `${height}px`); + } + _onReceivedEvent(event) { + switch (event.id) { + case LIGHTBOX_EVENT.CLOSE: + this._end(); + break; + default: + break; + } + } + _end() { + this.classList = 'lightboxOverlay animation fadeOutOverlay'; + // queue self destruction after the animation has finished + // FIXME: not sure if there is any way better than this + setTimeout(() => { + this.cmpRef.destroy(); + }, this.options.fadeDuration * 1000); + } + _getOverlayWidth() { + return Math.max(this._documentRef.body.scrollWidth, this._documentRef.body.offsetWidth, this._documentRef.documentElement.clientWidth, this._documentRef.documentElement.scrollWidth, this._documentRef.documentElement.offsetWidth); + } + _getOverlayHeight() { + return Math.max(this._documentRef.body.scrollHeight, this._documentRef.body.offsetHeight, this._documentRef.documentElement.clientHeight, this._documentRef.documentElement.scrollHeight, this._documentRef.documentElement.offsetHeight); + } +} +LightboxOverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxOverlayComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: LightboxEvent }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); +LightboxOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: LightboxOverlayComponent, selector: "[lb-overlay]", inputs: { options: "options", cmpRef: "cmpRef" }, host: { listeners: { "click": "close()", "window:resize": "onResize()" }, properties: { "class": "classList" } }, ngImport: i0, template: '', isInline: true }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxOverlayComponent, decorators: [{ + type: Component, + args: [{ + selector: '[lb-overlay]', + template: '', + host: { + '[class]': 'classList' + } + }] + }], ctorParameters: function () { + return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: LightboxEvent }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; + }, propDecorators: { options: [{ + type: Input + }], cmpRef: [{ + type: Input + }], close: [{ + type: HostListener, + args: ['click'] + }], onResize: [{ + type: HostListener, + args: ['window:resize'] + }] } }); + +class LightboxConfig { + constructor() { + this.fadeDuration = 0.7; + this.resizeDuration = 0.5; + this.fitImageInViewPort = true; + this.positionFromTop = 20; + this.showImageNumberLabel = false; + this.alwaysShowNavOnTouchDevices = false; + this.wrapAround = false; + this.disableKeyboardNav = false; + this.disableScrolling = false; + this.centerVertically = false; + this.enableTransition = true; + this.albumLabel = 'Image %1 of %2'; + this.showZoom = false; + this.showRotate = false; + this.containerElementResolver = (documentRef) => documentRef.querySelector('body'); + } +} +LightboxConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return []; } }); + +class Lightbox { + constructor(_componentFactoryResolver, _injector, _applicationRef, _lightboxConfig, _lightboxEvent, _documentRef) { + this._componentFactoryResolver = _componentFactoryResolver; + this._injector = _injector; + this._applicationRef = _applicationRef; + this._lightboxConfig = _lightboxConfig; + this._lightboxEvent = _lightboxEvent; + this._documentRef = _documentRef; + } + open(album, curIndex = 0, options = {}) { + const overlayComponentRef = this._createComponent(LightboxOverlayComponent); + const componentRef = this._createComponent(LightboxComponent); + const newOptions = {}; + // broadcast open event + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.OPEN }); + Object.assign(newOptions, this._lightboxConfig, options); + // attach input to lightbox + componentRef.instance.album = album; + componentRef.instance.currentImageIndex = curIndex; + componentRef.instance.options = newOptions; + componentRef.instance.cmpRef = componentRef; + // attach input to overlay + overlayComponentRef.instance.options = newOptions; + overlayComponentRef.instance.cmpRef = overlayComponentRef; + // FIXME: not sure why last event is broadcasted (which is CLOSED) and make + // lightbox can not be opened the second time. + // Need to timeout so that the OPEN event is set before component is initialized + setTimeout(() => { + this._applicationRef.attachView(overlayComponentRef.hostView); + this._applicationRef.attachView(componentRef.hostView); + overlayComponentRef.onDestroy(() => { + this._applicationRef.detachView(overlayComponentRef.hostView); + }); + componentRef.onDestroy(() => { + this._applicationRef.detachView(componentRef.hostView); + }); + const containerElement = newOptions.containerElementResolver(this._documentRef); + containerElement.appendChild(overlayComponentRef.location.nativeElement); + containerElement.appendChild(componentRef.location.nativeElement); + }); + } + close() { + if (this._lightboxEvent) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE }); + } + } + _createComponent(ComponentClass) { + const factory = this._componentFactoryResolver.resolveComponentFactory(ComponentClass); + const component = factory.create(this._injector); + return component; + } +} +Lightbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: LightboxConfig }, { token: LightboxEvent }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); +Lightbox.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { + return [{ type: i0.ComponentFactoryResolver }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: LightboxConfig }, { type: LightboxEvent }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; + } }); + +class LightboxModule { +} +LightboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); +LightboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe], imports: [CommonModule] }); +LightboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, providers: [ + Lightbox, + LightboxConfig, + LightboxEvent, + LightboxWindowRef + ], imports: [[CommonModule]] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, decorators: [{ + type: NgModule, + args: [{ + imports: [CommonModule], + declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe], + providers: [ + Lightbox, + LightboxConfig, + LightboxEvent, + LightboxWindowRef + ] + }] + }] }); + +/** + * Generated bundle index. Do not edit. + */ + +export { LIGHTBOX_EVENT, Lightbox, LightboxConfig, LightboxEvent, LightboxModule, LightboxWindowRef }; +//# sourceMappingURL=ngx-lightbox.mjs.map diff --git a/fesm2015/ngx-lightbox.mjs.map b/fesm2015/ngx-lightbox.mjs.map new file mode 100644 index 0000000..d0cc967 --- /dev/null +++ b/fesm2015/ngx-lightbox.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"ngx-lightbox.mjs","sources":["../../../projects/ngx-lightbox/src/lib/lightbox-event.service.ts","../../../projects/ngx-lightbox/src/lib/lightbox.component.ts","../../../projects/ngx-lightbox/src/lib/lightbox.component.html","../../../projects/ngx-lightbox/src/lib/lightbox-overlay.component.ts","../../../projects/ngx-lightbox/src/lib/lightbox-config.service.ts","../../../projects/ngx-lightbox/src/lib/lightbox.service.ts","../../../projects/ngx-lightbox/src/lib/lightbox.module.ts","../../../projects/ngx-lightbox/src/ngx-lightbox.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\r\n\r\nimport { Injectable} from '@angular/core';\r\n\r\nexport interface IEvent {\r\n id: number;\r\n data?: any;\r\n}\r\n\r\nexport interface IAlbum {\r\n src: string;\r\n caption?: string;\r\n thumb: string;\r\n iframe?: boolean;\r\n}\r\n\r\nexport const LIGHTBOX_EVENT = {\r\n CHANGE_PAGE: 1,\r\n CLOSE: 2,\r\n OPEN: 3,\r\n ZOOM_IN: 4,\r\n ZOOM_OUT: 5,\r\n ROTATE_LEFT: 6,\r\n ROTATE_RIGHT: 7,\r\n FILE_NOT_FOUND: 8\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LightboxEvent {\r\n private _lightboxEventSource: Subject;\r\n public lightboxEvent$: Observable;\r\n constructor() {\r\n this._lightboxEventSource = new Subject();\r\n this.lightboxEvent$ = this._lightboxEventSource.asObservable();\r\n }\r\n\r\n broadcastLightboxEvent(event: any): void {\r\n this._lightboxEventSource.next(event);\r\n }\r\n}\r\n\r\nfunction getWindow (): any {\r\n return window;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LightboxWindowRef {\r\n get nativeWindow (): any {\r\n return getWindow();\r\n }\r\n}\r\n","import {DOCUMENT} from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit, Pipe, PipeTransform,\r\n Renderer2,\r\n SecurityContext,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {DomSanitizer} from '@angular/platform-browser';\r\n\r\nimport {IAlbum, IEvent, LIGHTBOX_EVENT, LightboxEvent, LightboxWindowRef} from './lightbox-event.service';\r\n\r\n@Pipe({ name: 'safe' })\r\nexport class SafePipe implements PipeTransform {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n transform(url) {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: '[lb-content]',\r\n host: {\r\n '[class]': 'ui.classList'\r\n },\r\n templateUrl: \"./lightbox.component.html\",\r\n})\r\nexport class LightboxComponent implements OnInit, AfterViewInit, OnDestroy, OnInit {\r\n @Input() album: Array;\r\n @Input() currentImageIndex: number;\r\n @Input() options: any;\r\n @Input() cmpRef: any;\r\n @ViewChild('outerContainer') _outerContainerElem: ElementRef;\r\n @ViewChild('container') _containerElem: ElementRef;\r\n @ViewChild('leftArrow') _leftArrowElem: ElementRef;\r\n @ViewChild('rightArrow') _rightArrowElem: ElementRef;\r\n @ViewChild('navArrow') _navArrowElem: ElementRef;\r\n @ViewChild('dataContainer') _dataContainerElem: ElementRef;\r\n @ViewChild('image') _imageElem: ElementRef;\r\n @ViewChild('iframe') _iframeElem: ElementRef;\r\n @ViewChild('caption') _captionElem: ElementRef;\r\n @ViewChild('number') _numberElem: ElementRef;\r\n public content: any;\r\n public ui: any;\r\n private _cssValue: any;\r\n private _event: any;\r\n private _windowRef: any;\r\n private rotate: number;\r\n constructor(\r\n private _elemRef: ElementRef,\r\n private _rendererRef: Renderer2,\r\n private _lightboxEvent: LightboxEvent,\r\n public _lightboxElem: ElementRef,\r\n private _lightboxWindowRef: LightboxWindowRef,\r\n private _sanitizer: DomSanitizer,\r\n @Inject(DOCUMENT) private _documentRef\r\n ) {\r\n // initialize data\r\n this.options = this.options || {};\r\n this.album = this.album || [];\r\n this.currentImageIndex = this.currentImageIndex || 0;\r\n this._windowRef = this._lightboxWindowRef.nativeWindow;\r\n\r\n // control the interactive of the directive\r\n this.ui = {\r\n // control the appear of the reloader\r\n // false: image has loaded completely and ready to be shown\r\n // true: image is still loading\r\n showReloader: true,\r\n\r\n // control the appear of the nav arrow\r\n // the arrowNav is the parent of both left and right arrow\r\n // in some cases, the parent shows but the child does not show\r\n showLeftArrow: false,\r\n showRightArrow: false,\r\n showArrowNav: false,\r\n\r\n // control the appear of the zoom and rotate buttons\r\n showZoomButton: false,\r\n showRotateButton: false,\r\n\r\n // control whether to show the\r\n // page number or not\r\n showPageNumber: false,\r\n showCaption: false,\r\n classList: 'lightbox animation fadeIn'\r\n };\r\n\r\n this.content = {\r\n pageNumber: ''\r\n };\r\n\r\n this._event = {};\r\n this._lightboxElem = this._elemRef;\r\n this._event.subscription = this._lightboxEvent.lightboxEvent$\r\n .subscribe((event: IEvent) => this._onReceivedEvent(event));\r\n this.rotate = 0;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.album.forEach(album => {\r\n if (album.caption) {\r\n album.caption = this._sanitizer.sanitize(SecurityContext.HTML, album.caption);\r\n }\r\n });\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // need to init css value here, after the view ready\r\n // actually these values are always 0\r\n this._cssValue = {\r\n containerTopPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-top')),\r\n containerRightPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-right')),\r\n containerBottomPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-bottom')),\r\n containerLeftPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-left')),\r\n imageBorderWidthTop: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-top-width')),\r\n imageBorderWidthBottom: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-bottom-width')),\r\n imageBorderWidthLeft: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-left-width')),\r\n imageBorderWidthRight: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-right-width'))\r\n };\r\n\r\n if (this._validateInputData()) {\r\n this._prepareComponent();\r\n this._registerImageLoadingEvent();\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (!this.options.disableKeyboardNav) {\r\n // unbind keyboard event\r\n this._disableKeyboardNav();\r\n }\r\n\r\n this._event.subscription.unsubscribe();\r\n }\r\n\r\n @HostListener('close', ['$event'])\r\n public close($event: any): void {\r\n $event.stopPropagation();\r\n if ($event.target.classList.contains('lightbox') ||\r\n $event.target.classList.contains('lb-loader') ||\r\n $event.target.classList.contains('lb-close')) {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null });\r\n }\r\n }\r\n\r\n public control($event: any): void {\r\n $event.stopPropagation();\r\n let height: number;\r\n let width: number;\r\n if ($event.target.classList.contains('lb-turnLeft')) {\r\n this.rotate = this.rotate - 90;\r\n this._rotateContainer();\r\n this._calcTransformPoint();\r\n this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`;\r\n this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`;\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_LEFT, data: null });\r\n } else if ($event.target.classList.contains('lb-turnRight')) {\r\n this.rotate = this.rotate + 90;\r\n this._rotateContainer();\r\n this._calcTransformPoint();\r\n this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`;\r\n this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`;\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_RIGHT, data: null });\r\n } else if ($event.target.classList.contains('lb-zoomOut')) {\r\n height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) / 1.5;\r\n width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) / 1.5;\r\n this._documentRef.getElementById('outerContainer').style.height = height + 'px';\r\n this._documentRef.getElementById('outerContainer').style.width = width + 'px';\r\n height = parseInt(this._documentRef.getElementById('image').style.height, 10) / 1.5;\r\n width = parseInt(this._documentRef.getElementById('image').style.width, 10) / 1.5;\r\n this._documentRef.getElementById('image').style.height = height + 'px';\r\n this._documentRef.getElementById('image').style.width = width + 'px';\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_OUT, data: null });\r\n } else if ($event.target.classList.contains('lb-zoomIn')) {\r\n height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) * 1.5;\r\n width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) * 1.5;\r\n this._documentRef.getElementById('outerContainer').style.height = height + 'px';\r\n this._documentRef.getElementById('outerContainer').style.width = width + 'px';\r\n height = parseInt(this._documentRef.getElementById('image').style.height, 10) * 1.5;\r\n width = parseInt(this._documentRef.getElementById('image').style.width, 10) * 1.5;\r\n this._documentRef.getElementById('image').style.height = height + 'px';\r\n this._documentRef.getElementById('image').style.width = width + 'px';\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_IN, data: null });\r\n }\r\n }\r\n\r\n private _rotateContainer(): void {\r\n let temp = this.rotate;\r\n if (temp < 0) {\r\n temp *= -1;\r\n }\r\n if (temp / 90 % 4 === 1 || temp / 90 % 4 === 3) {\r\n this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.height;\r\n this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height;\r\n } else {\r\n this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.height;\r\n this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height;\r\n }\r\n }\r\n\r\n private _resetImage(): void {\r\n this.rotate = 0;\r\n const image = this._documentRef.getElementById('image');\r\n if (image) {\r\n image.style.transform = `rotate(${this.rotate}deg)`;\r\n image.style.webkitTransform = `rotate(${this.rotate}deg)`;\r\n }\r\n\r\n }\r\n\r\n private _calcTransformPoint(): void {\r\n let height = parseInt(this._documentRef.getElementById('image').style.height, 10);\r\n let width = parseInt(this._documentRef.getElementById('image').style.width, 10);\r\n let temp = this.rotate % 360;\r\n if (temp < 0) {\r\n temp = 360 + temp;\r\n }\r\n if (temp === 90) {\r\n this._documentRef.getElementById('image').style.transformOrigin = (height / 2) + 'px ' + (height / 2) + 'px';\r\n } else if (temp === 180) {\r\n this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (height / 2) + 'px';\r\n } else if (temp === 270) {\r\n this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (width / 2) + 'px';\r\n }\r\n }\r\n\r\n public nextImage(): void {\r\n if (this.album.length === 1) {\r\n return;\r\n } else if (this.currentImageIndex === this.album.length - 1) {\r\n this._changeImage(0);\r\n } else {\r\n this._changeImage(this.currentImageIndex + 1);\r\n }\r\n }\r\n\r\n public prevImage(): void {\r\n if (this.album.length === 1) {\r\n return;\r\n } else if (this.currentImageIndex === 0 && this.album.length > 1) {\r\n this._changeImage(this.album.length - 1);\r\n } else {\r\n this._changeImage(this.currentImageIndex - 1);\r\n }\r\n }\r\n\r\n private _validateInputData(): boolean {\r\n if (this.album &&\r\n this.album instanceof Array &&\r\n this.album.length > 0) {\r\n for (let i = 0; i < this.album.length; i++) {\r\n // check whether each _nside\r\n // album has src data or not\r\n if (this.album[i].src) {\r\n continue;\r\n }\r\n\r\n throw new Error('One of the album data does not have source data');\r\n }\r\n } else {\r\n throw new Error('No album data or album data is not correct in type');\r\n }\r\n\r\n // to prevent data understand as string\r\n // convert it to number\r\n if (isNaN(this.currentImageIndex)) {\r\n throw new Error('Current image index is not a number');\r\n } else {\r\n this.currentImageIndex = Number(this.currentImageIndex);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _registerImageLoadingEvent(): void {\r\n const src: any = this.album[this.currentImageIndex].src;\r\n\r\n if (this.album[this.currentImageIndex].iframe || this.needsIframe(src)) {\r\n setTimeout( () => {\r\n this._onLoadImageSuccess();\r\n });\r\n return;\r\n }\r\n\r\n const preloader = new Image();\r\n\r\n preloader.onload = () => {\r\n this._onLoadImageSuccess();\r\n }\r\n\r\n preloader.onerror = (e) => {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.FILE_NOT_FOUND, data: e });\r\n }\r\n\r\n preloader.src = this._sanitizer.sanitize(SecurityContext.URL, src);\r\n }\r\n\r\n /**\r\n * Fire when the image is loaded\r\n */\r\n private _onLoadImageSuccess(): void {\r\n if (!this.options.disableKeyboardNav) {\r\n // unbind keyboard event during transition\r\n this._disableKeyboardNav();\r\n }\r\n\r\n let imageHeight;\r\n let imageWidth;\r\n let maxImageHeight;\r\n let maxImageWidth;\r\n let windowHeight;\r\n let windowWidth;\r\n let naturalImageWidth;\r\n let naturalImageHeight;\r\n\r\n // set default width and height of image to be its natural\r\n imageWidth = naturalImageWidth = this._imageElem ? this._imageElem.nativeElement.naturalWidth : this._windowRef.innerWidth * .8;\r\n imageHeight = naturalImageHeight = this._imageElem ? this._imageElem.nativeElement.naturalHeight : this._windowRef.innerHeight * .8;\r\n if (this.options.fitImageInViewPort) {\r\n windowWidth = this._windowRef.innerWidth;\r\n windowHeight = this._windowRef.innerHeight;\r\n maxImageWidth = windowWidth - this._cssValue.containerLeftPadding -\r\n this._cssValue.containerRightPadding - this._cssValue.imageBorderWidthLeft -\r\n this._cssValue.imageBorderWidthRight - 20;\r\n maxImageHeight = windowHeight - this._cssValue.containerTopPadding -\r\n this._cssValue.containerTopPadding - this._cssValue.imageBorderWidthTop -\r\n this._cssValue.imageBorderWidthBottom - 120;\r\n if (naturalImageWidth > maxImageWidth || naturalImageHeight > maxImageHeight) {\r\n if ((naturalImageWidth / maxImageWidth) > (naturalImageHeight / maxImageHeight)) {\r\n imageWidth = maxImageWidth;\r\n imageHeight = Math.round(naturalImageHeight / (naturalImageWidth / imageWidth));\r\n } else {\r\n imageHeight = maxImageHeight;\r\n imageWidth = Math.round(naturalImageWidth / (naturalImageHeight / imageHeight));\r\n }\r\n }\r\n\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'width', `${imageWidth}px`);\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'height', `${imageHeight}px`);\r\n }\r\n\r\n this._sizeContainer(imageWidth, imageHeight);\r\n\r\n if (this.options.centerVertically) {\r\n this._centerVertically(imageWidth, imageHeight);\r\n }\r\n }\r\n\r\n private _centerVertically(imageWidth: number, imageHeight: number): void {\r\n const scrollOffset = this._documentRef.documentElement.scrollTop;\r\n const windowHeight = this._windowRef.innerHeight;\r\n\r\n const viewOffset = windowHeight / 2 - imageHeight / 2;\r\n const topDistance = scrollOffset + viewOffset;\r\n\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${topDistance}px`);\r\n }\r\n\r\n private _sizeContainer(imageWidth: number, imageHeight: number): void {\r\n const oldWidth = this._outerContainerElem.nativeElement.offsetWidth;\r\n const oldHeight = this._outerContainerElem.nativeElement.offsetHeight;\r\n const newWidth = imageWidth + this._cssValue.containerRightPadding + this._cssValue.containerLeftPadding +\r\n this._cssValue.imageBorderWidthLeft + this._cssValue.imageBorderWidthRight;\r\n const newHeight = imageHeight + this._cssValue.containerTopPadding + this._cssValue.containerBottomPadding +\r\n this._cssValue.imageBorderWidthTop + this._cssValue.imageBorderWidthBottom;\r\n\r\n // make sure that distances are large enough for transitionend event to be fired, at least 5px.\r\n if (Math.abs(oldWidth - newWidth) + Math.abs(oldHeight - newHeight) > 5) {\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'width', `${newWidth}px`);\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'height', `${newHeight}px`);\r\n\r\n // bind resize event to outer container\r\n // use enableTransition to prevent infinite loader\r\n if (this.options.enableTransition) {\r\n this._event.transitions = [];\r\n ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd', 'MSTransitionEnd'].forEach(eventName => {\r\n this._event.transitions.push(\r\n this._rendererRef.listen(this._outerContainerElem.nativeElement, eventName, (event: any) => {\r\n if (event.target === event.currentTarget) {\r\n this._postResize(newWidth, newHeight);\r\n }\r\n })\r\n );\r\n });\r\n } else {\r\n this._postResize(newWidth, newHeight);\r\n }\r\n } else {\r\n this._postResize(newWidth, newHeight);\r\n }\r\n }\r\n\r\n private _postResize(newWidth: number, newHeight: number): void {\r\n // unbind resize event\r\n if (Array.isArray(this._event.transitions)) {\r\n this._event.transitions.forEach((eventHandler: any) => {\r\n eventHandler();\r\n });\r\n\r\n this._event.transitions = [];\r\n }\r\n\r\n this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'width', `${newWidth}px`);\r\n this._showImage();\r\n }\r\n\r\n private _showImage(): void {\r\n this.ui.showReloader = false;\r\n this._updateNav();\r\n this._updateDetails();\r\n if (!this.options.disableKeyboardNav) {\r\n this._enableKeyboardNav();\r\n }\r\n }\r\n\r\n private _prepareComponent(): void {\r\n // add css3 animation\r\n this._addCssAnimation();\r\n\r\n // position the image according to user's option\r\n this._positionLightBox();\r\n\r\n // update controls visibility on next view generation\r\n setTimeout(() => {\r\n this.ui.showZoomButton = this.options.showZoom;\r\n this.ui.showRotateButton = this.options.showRotate;\r\n }, 0);\r\n }\r\n\r\n private _positionLightBox(): void {\r\n // @see https://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll\r\n const top = (this._windowRef.pageYOffset || this._documentRef.documentElement.scrollTop) +\r\n this.options.positionFromTop;\r\n const left = this._windowRef.pageXOffset || this._documentRef.documentElement.scrollLeft;\r\n\r\n if (!this.options.centerVertically) {\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${top}px`);\r\n }\r\n\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'left', `${left}px`);\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'display', 'block');\r\n\r\n // disable scrolling of the page while open\r\n if (this.options.disableScrolling) {\r\n this._rendererRef.addClass(this._documentRef.documentElement, 'lb-disable-scrolling');\r\n }\r\n }\r\n\r\n /**\r\n * addCssAnimation add css3 classes for animate lightbox\r\n */\r\n private _addCssAnimation(): void {\r\n const resizeDuration = this.options.resizeDuration;\r\n const fadeDuration = this.options.fadeDuration;\r\n\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement,\r\n '-webkit-transition-duration', `${resizeDuration}s`);\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement,\r\n 'transition-duration', `${resizeDuration}s`);\r\n this._rendererRef.setStyle(this._dataContainerElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._dataContainerElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._captionElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._captionElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._numberElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._numberElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n }\r\n\r\n private _end(): void {\r\n this.ui.classList = 'lightbox animation fadeOut';\r\n if (this.options.disableScrolling) {\r\n this._rendererRef.removeClass(this._documentRef.documentElement, 'lb-disable-scrolling');\r\n }\r\n setTimeout(() => {\r\n this.cmpRef.destroy();\r\n }, this.options.fadeDuration * 1000);\r\n }\r\n\r\n private _updateDetails(): void {\r\n // update the caption\r\n if (typeof this.album[this.currentImageIndex].caption !== 'undefined' &&\r\n this.album[this.currentImageIndex].caption !== '') {\r\n this.ui.showCaption = true;\r\n }\r\n\r\n // update the page number if user choose to do so\r\n // does not perform numbering the page if the\r\n // array length in album <= 1\r\n if (this.album.length > 1 && this.options.showImageNumberLabel) {\r\n this.ui.showPageNumber = true;\r\n this.content.pageNumber = this._albumLabel();\r\n }\r\n }\r\n\r\n private _albumLabel(): string {\r\n // due to {this.currentImageIndex} is set from 0 to {this.album.length} - 1\r\n return this.options.albumLabel.replace(/%1/g, Number(this.currentImageIndex + 1)).replace(/%2/g, this.album.length);\r\n }\r\n\r\n private _changeImage(newIndex: number): void {\r\n this._resetImage();\r\n this.currentImageIndex = newIndex;\r\n this._hideImage();\r\n this._registerImageLoadingEvent();\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CHANGE_PAGE, data: newIndex });\r\n }\r\n\r\n private _hideImage(): void {\r\n this.ui.showReloader = true;\r\n this.ui.showArrowNav = false;\r\n this.ui.showLeftArrow = false;\r\n this.ui.showRightArrow = false;\r\n this.ui.showPageNumber = false;\r\n this.ui.showCaption = false;\r\n }\r\n\r\n private _updateNav(): void {\r\n let alwaysShowNav = false;\r\n\r\n // check to see the browser support touch event\r\n try {\r\n this._documentRef.createEvent('TouchEvent');\r\n alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;\r\n } catch (e) {\r\n // noop\r\n }\r\n\r\n // initially show the arrow nav\r\n // which is the parent of both left and right nav\r\n this._showArrowNav();\r\n if (this.album.length > 1) {\r\n if (this.options.wrapAround) {\r\n if (alwaysShowNav) {\r\n // alternatives this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');\r\n this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1');\r\n this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1');\r\n }\r\n\r\n // alternatives this.$lightbox.find('.lb-prev, .lb-next').show();\r\n this._showLeftArrowNav();\r\n this._showRightArrowNav();\r\n } else {\r\n if (this.currentImageIndex > 0) {\r\n // alternatives this.$lightbox.find('.lb-prev').show();\r\n this._showLeftArrowNav();\r\n if (alwaysShowNav) {\r\n // alternatives this.$lightbox.find('.lb-prev').css('opacity', '1');\r\n this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1');\r\n }\r\n }\r\n\r\n if (this.currentImageIndex < this.album.length - 1) {\r\n // alternatives this.$lightbox.find('.lb-next').show();\r\n this._showRightArrowNav();\r\n if (alwaysShowNav) {\r\n // alternatives this.$lightbox.find('.lb-next').css('opacity', '1');\r\n this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _showLeftArrowNav(): void {\r\n this.ui.showLeftArrow = true;\r\n }\r\n\r\n private _showRightArrowNav(): void {\r\n this.ui.showRightArrow = true;\r\n }\r\n\r\n private _showArrowNav(): void {\r\n this.ui.showArrowNav = (this.album.length !== 1);\r\n }\r\n\r\n private _enableKeyboardNav(): void {\r\n this._event.keyup = this._rendererRef.listen('document', 'keyup', (event: any) => {\r\n this._keyboardAction(event);\r\n });\r\n }\r\n\r\n private _disableKeyboardNav(): void {\r\n if (this._event.keyup) {\r\n this._event.keyup();\r\n }\r\n }\r\n\r\n private _keyboardAction($event: any): void {\r\n const KEYCODE_ESC = 27;\r\n const KEYCODE_LEFTARROW = 37;\r\n const KEYCODE_RIGHTARROW = 39;\r\n const keycode = $event.keyCode;\r\n const key = String.fromCharCode(keycode).toLowerCase();\r\n\r\n if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null });\r\n } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {\r\n if (this.currentImageIndex !== 0) {\r\n this._changeImage(this.currentImageIndex - 1);\r\n } else if (this.options.wrapAround && this.album.length > 1) {\r\n this._changeImage(this.album.length - 1);\r\n }\r\n } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {\r\n if (this.currentImageIndex !== this.album.length - 1) {\r\n this._changeImage(this.currentImageIndex + 1);\r\n } else if (this.options.wrapAround && this.album.length > 1) {\r\n this._changeImage(0);\r\n }\r\n }\r\n }\r\n\r\n private _getCssStyleValue(elem: any, propertyName: string): number {\r\n return parseFloat(this._windowRef\r\n .getComputedStyle(elem.nativeElement, null)\r\n .getPropertyValue(propertyName));\r\n }\r\n\r\n private _onReceivedEvent(event: IEvent): void {\r\n switch (event.id) {\r\n case LIGHTBOX_EVENT.CLOSE:\r\n this._end();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n public needsIframe(src: string) {\r\n // const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, src);\r\n if (src.match(/\\.pdf$/)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
","import { Subscription } from 'rxjs';\r\n\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2\r\n} from '@angular/core';\r\n\r\nimport { IEvent, LIGHTBOX_EVENT, LightboxEvent } from './lightbox-event.service';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Component({\r\n selector: '[lb-overlay]',\r\n template: '',\r\n host: {\r\n '[class]': 'classList'\r\n }\r\n})\r\nexport class LightboxOverlayComponent implements AfterViewInit, OnDestroy {\r\n @Input() options: any;\r\n @Input() cmpRef: any;\r\n public classList;\r\n private _subscription: Subscription;\r\n constructor(\r\n private _elemRef: ElementRef,\r\n private _rendererRef: Renderer2,\r\n private _lightboxEvent: LightboxEvent,\r\n @Inject(DOCUMENT) private _documentRef,\r\n ) {\r\n this.classList = 'lightboxOverlay animation fadeInOverlay';\r\n this._subscription = this._lightboxEvent.lightboxEvent$.subscribe((event: IEvent) => this._onReceivedEvent(event));\r\n }\r\n\r\n @HostListener('click')\r\n public close(): void {\r\n // broadcast to itself and all others subscriber including the components\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null });\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n const fadeDuration = this.options.fadeDuration;\r\n\r\n this._rendererRef.setStyle(this._elemRef.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._elemRef.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._sizeOverlay();\r\n }\r\n\r\n @HostListener('window:resize')\r\n public onResize(): void {\r\n this._sizeOverlay();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subscription.unsubscribe();\r\n }\r\n\r\n private _sizeOverlay(): void {\r\n const width = this._getOverlayWidth();\r\n const height = this._getOverlayHeight();\r\n\r\n this._rendererRef.setStyle(this._elemRef.nativeElement, 'width', `${width}px`);\r\n this._rendererRef.setStyle(this._elemRef.nativeElement, 'height', `${height}px`);\r\n }\r\n\r\n private _onReceivedEvent(event: IEvent): void {\r\n switch (event.id) {\r\n case LIGHTBOX_EVENT.CLOSE:\r\n this._end();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n private _end(): void {\r\n this.classList = 'lightboxOverlay animation fadeOutOverlay';\r\n\r\n // queue self destruction after the animation has finished\r\n // FIXME: not sure if there is any way better than this\r\n setTimeout(() => {\r\n this.cmpRef.destroy();\r\n }, this.options.fadeDuration * 1000);\r\n }\r\n\r\n private _getOverlayWidth(): number {\r\n return Math.max(\r\n this._documentRef.body.scrollWidth,\r\n this._documentRef.body.offsetWidth,\r\n this._documentRef.documentElement.clientWidth,\r\n this._documentRef.documentElement.scrollWidth,\r\n this._documentRef.documentElement.offsetWidth\r\n );\r\n }\r\n\r\n private _getOverlayHeight(): number {\r\n return Math.max(\r\n this._documentRef.body.scrollHeight,\r\n this._documentRef.body.offsetHeight,\r\n this._documentRef.documentElement.clientHeight,\r\n this._documentRef.documentElement.scrollHeight,\r\n this._documentRef.documentElement.offsetHeight\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LightboxConfig {\r\n public fadeDuration: number;\r\n public resizeDuration: number;\r\n public fitImageInViewPort: boolean;\r\n public positionFromTop: number;\r\n public showImageNumberLabel: boolean;\r\n public alwaysShowNavOnTouchDevices: boolean;\r\n public wrapAround: boolean;\r\n public disableKeyboardNav: boolean;\r\n public disableScrolling: boolean;\r\n public centerVertically: boolean;\r\n public enableTransition: boolean;\r\n public albumLabel: string;\r\n public showZoom: boolean;\r\n public showRotate: boolean;\r\n public containerElementResolver: (document: any) => HTMLElement;\r\n\r\n constructor() {\r\n this.fadeDuration = 0.7;\r\n this.resizeDuration = 0.5;\r\n this.fitImageInViewPort = true;\r\n this.positionFromTop = 20;\r\n this.showImageNumberLabel = false;\r\n this.alwaysShowNavOnTouchDevices = false;\r\n this.wrapAround = false;\r\n this.disableKeyboardNav = false;\r\n this.disableScrolling = false;\r\n this.centerVertically = false;\r\n this.enableTransition = true;\r\n this.albumLabel = 'Image %1 of %2';\r\n this.showZoom = false;\r\n this.showRotate = false;\r\n this.containerElementResolver = (documentRef) => documentRef.querySelector('body');\r\n }\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentFactoryResolver,\r\n ComponentRef,\r\n Inject,\r\n Injectable,\r\n Injector\r\n} from '@angular/core';\r\nimport { LightboxComponent } from './lightbox.component';\r\nimport { LightboxConfig } from './lightbox-config.service';\r\nimport { LightboxEvent, LIGHTBOX_EVENT, IAlbum } from './lightbox-event.service';\r\nimport { LightboxOverlayComponent } from './lightbox-overlay.component';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class Lightbox {\r\n constructor(\r\n private _componentFactoryResolver: ComponentFactoryResolver,\r\n private _injector: Injector,\r\n private _applicationRef: ApplicationRef,\r\n private _lightboxConfig: LightboxConfig,\r\n private _lightboxEvent: LightboxEvent,\r\n @Inject(DOCUMENT) private _documentRef\r\n ) { }\r\n\r\n open(album: Array, curIndex = 0, options = {}): void {\r\n const overlayComponentRef = this._createComponent(LightboxOverlayComponent);\r\n const componentRef = this._createComponent(LightboxComponent);\r\n const newOptions: Partial = {};\r\n\r\n // broadcast open event\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.OPEN });\r\n Object.assign(newOptions, this._lightboxConfig, options);\r\n\r\n // attach input to lightbox\r\n componentRef.instance.album = album;\r\n componentRef.instance.currentImageIndex = curIndex;\r\n componentRef.instance.options = newOptions;\r\n componentRef.instance.cmpRef = componentRef;\r\n\r\n // attach input to overlay\r\n overlayComponentRef.instance.options = newOptions;\r\n overlayComponentRef.instance.cmpRef = overlayComponentRef;\r\n\r\n // FIXME: not sure why last event is broadcasted (which is CLOSED) and make\r\n // lightbox can not be opened the second time.\r\n // Need to timeout so that the OPEN event is set before component is initialized\r\n setTimeout(() => {\r\n this._applicationRef.attachView(overlayComponentRef.hostView);\r\n this._applicationRef.attachView(componentRef.hostView);\r\n overlayComponentRef.onDestroy(() => {\r\n this._applicationRef.detachView(overlayComponentRef.hostView);\r\n });\r\n componentRef.onDestroy(() => {\r\n this._applicationRef.detachView(componentRef.hostView);\r\n });\r\n\r\n const containerElement = newOptions.containerElementResolver(this._documentRef);\r\n containerElement.appendChild(overlayComponentRef.location.nativeElement);\r\n containerElement.appendChild(componentRef.location.nativeElement);\r\n });\r\n }\r\n\r\n close(): void {\r\n if (this._lightboxEvent) {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE });\r\n }\r\n }\r\n\r\n _createComponent(ComponentClass: any): ComponentRef {\r\n const factory = this._componentFactoryResolver.resolveComponentFactory(ComponentClass);\r\n const component = factory.create(this._injector);\r\n\r\n return component;\r\n }\r\n}\r\n","import { Lightbox } from './lightbox.service';\r\nimport {LightboxComponent, SafePipe} from './lightbox.component';\r\nimport { LightboxConfig } from './lightbox-config.service';\r\nimport { LightboxEvent, LightboxWindowRef } from './lightbox-event.service';\r\nimport { LightboxOverlayComponent } from './lightbox-overlay.component';\r\nimport { NgModule } from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe],\r\n providers: [\r\n Lightbox,\r\n LightboxConfig,\r\n LightboxEvent,\r\n LightboxWindowRef\r\n ]\r\n})\r\nexport class LightboxModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/fesm2020/ngx-lightbox.mjs b/fesm2020/ngx-lightbox.mjs new file mode 100644 index 0000000..008979d --- /dev/null +++ b/fesm2020/ngx-lightbox.mjs @@ -0,0 +1,857 @@ +import * as i0 from '@angular/core'; +import { Injectable, Pipe, SecurityContext, Component, Inject, Input, ViewChild, HostListener, NgModule } from '@angular/core'; +import * as i3 from '@angular/common'; +import { DOCUMENT, CommonModule } from '@angular/common'; +import { Subject } from 'rxjs'; +import * as i1 from '@angular/platform-browser'; + +const LIGHTBOX_EVENT = { + CHANGE_PAGE: 1, + CLOSE: 2, + OPEN: 3, + ZOOM_IN: 4, + ZOOM_OUT: 5, + ROTATE_LEFT: 6, + ROTATE_RIGHT: 7, + FILE_NOT_FOUND: 8 +}; +class LightboxEvent { + constructor() { + this._lightboxEventSource = new Subject(); + this.lightboxEvent$ = this._lightboxEventSource.asObservable(); + } + broadcastLightboxEvent(event) { + this._lightboxEventSource.next(event); + } +} +LightboxEvent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxEvent.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxEvent, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return []; } }); +function getWindow() { + return window; +} +class LightboxWindowRef { + get nativeWindow() { + return getWindow(); + } +} +LightboxWindowRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxWindowRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxWindowRef, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }] }); + +class SafePipe { + constructor(sanitizer) { + this.sanitizer = sanitizer; + } + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} +SafePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); +SafePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, name: "safe" }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SafePipe, decorators: [{ + type: Pipe, + args: [{ name: 'safe' }] + }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } }); +class LightboxComponent { + constructor(_elemRef, _rendererRef, _lightboxEvent, _lightboxElem, _lightboxWindowRef, _sanitizer, _documentRef) { + this._elemRef = _elemRef; + this._rendererRef = _rendererRef; + this._lightboxEvent = _lightboxEvent; + this._lightboxElem = _lightboxElem; + this._lightboxWindowRef = _lightboxWindowRef; + this._sanitizer = _sanitizer; + this._documentRef = _documentRef; + // initialize data + this.options = this.options || {}; + this.album = this.album || []; + this.currentImageIndex = this.currentImageIndex || 0; + this._windowRef = this._lightboxWindowRef.nativeWindow; + // control the interactive of the directive + this.ui = { + // control the appear of the reloader + // false: image has loaded completely and ready to be shown + // true: image is still loading + showReloader: true, + // control the appear of the nav arrow + // the arrowNav is the parent of both left and right arrow + // in some cases, the parent shows but the child does not show + showLeftArrow: false, + showRightArrow: false, + showArrowNav: false, + // control the appear of the zoom and rotate buttons + showZoomButton: false, + showRotateButton: false, + // control whether to show the + // page number or not + showPageNumber: false, + showCaption: false, + classList: 'lightbox animation fadeIn' + }; + this.content = { + pageNumber: '' + }; + this._event = {}; + this._lightboxElem = this._elemRef; + this._event.subscription = this._lightboxEvent.lightboxEvent$ + .subscribe((event) => this._onReceivedEvent(event)); + this.rotate = 0; + } + ngOnInit() { + this.album.forEach(album => { + if (album.caption) { + album.caption = this._sanitizer.sanitize(SecurityContext.HTML, album.caption); + } + }); + } + ngAfterViewInit() { + // need to init css value here, after the view ready + // actually these values are always 0 + this._cssValue = { + containerTopPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-top')), + containerRightPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-right')), + containerBottomPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-bottom')), + containerLeftPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-left')), + imageBorderWidthTop: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-top-width')), + imageBorderWidthBottom: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-bottom-width')), + imageBorderWidthLeft: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-left-width')), + imageBorderWidthRight: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-right-width')) + }; + if (this._validateInputData()) { + this._prepareComponent(); + this._registerImageLoadingEvent(); + } + } + ngOnDestroy() { + if (!this.options.disableKeyboardNav) { + // unbind keyboard event + this._disableKeyboardNav(); + } + this._event.subscription.unsubscribe(); + } + close($event) { + $event.stopPropagation(); + if ($event.target.classList.contains('lightbox') || + $event.target.classList.contains('lb-loader') || + $event.target.classList.contains('lb-close')) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + } + control($event) { + $event.stopPropagation(); + let height; + let width; + if ($event.target.classList.contains('lb-turnLeft')) { + this.rotate = this.rotate - 90; + this._rotateContainer(); + this._calcTransformPoint(); + this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`; + this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_LEFT, data: null }); + } + else if ($event.target.classList.contains('lb-turnRight')) { + this.rotate = this.rotate + 90; + this._rotateContainer(); + this._calcTransformPoint(); + this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`; + this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_RIGHT, data: null }); + } + else if ($event.target.classList.contains('lb-zoomOut')) { + height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) / 1.5; + width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) / 1.5; + this._documentRef.getElementById('outerContainer').style.height = height + 'px'; + this._documentRef.getElementById('outerContainer').style.width = width + 'px'; + height = parseInt(this._documentRef.getElementById('image').style.height, 10) / 1.5; + width = parseInt(this._documentRef.getElementById('image').style.width, 10) / 1.5; + this._documentRef.getElementById('image').style.height = height + 'px'; + this._documentRef.getElementById('image').style.width = width + 'px'; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_OUT, data: null }); + } + else if ($event.target.classList.contains('lb-zoomIn')) { + height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) * 1.5; + width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) * 1.5; + this._documentRef.getElementById('outerContainer').style.height = height + 'px'; + this._documentRef.getElementById('outerContainer').style.width = width + 'px'; + height = parseInt(this._documentRef.getElementById('image').style.height, 10) * 1.5; + width = parseInt(this._documentRef.getElementById('image').style.width, 10) * 1.5; + this._documentRef.getElementById('image').style.height = height + 'px'; + this._documentRef.getElementById('image').style.width = width + 'px'; + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_IN, data: null }); + } + } + _rotateContainer() { + let temp = this.rotate; + if (temp < 0) { + temp *= -1; + } + if (temp / 90 % 4 === 1 || temp / 90 % 4 === 3) { + this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.height; + this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height; + } + else { + this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.height; + this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width; + this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height; + } + } + _resetImage() { + this.rotate = 0; + const image = this._documentRef.getElementById('image'); + if (image) { + image.style.transform = `rotate(${this.rotate}deg)`; + image.style.webkitTransform = `rotate(${this.rotate}deg)`; + } + } + _calcTransformPoint() { + let height = parseInt(this._documentRef.getElementById('image').style.height, 10); + let width = parseInt(this._documentRef.getElementById('image').style.width, 10); + let temp = this.rotate % 360; + if (temp < 0) { + temp = 360 + temp; + } + if (temp === 90) { + this._documentRef.getElementById('image').style.transformOrigin = (height / 2) + 'px ' + (height / 2) + 'px'; + } + else if (temp === 180) { + this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (height / 2) + 'px'; + } + else if (temp === 270) { + this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (width / 2) + 'px'; + } + } + nextImage() { + if (this.album.length === 1) { + return; + } + else if (this.currentImageIndex === this.album.length - 1) { + this._changeImage(0); + } + else { + this._changeImage(this.currentImageIndex + 1); + } + } + prevImage() { + if (this.album.length === 1) { + return; + } + else if (this.currentImageIndex === 0 && this.album.length > 1) { + this._changeImage(this.album.length - 1); + } + else { + this._changeImage(this.currentImageIndex - 1); + } + } + _validateInputData() { + if (this.album && + this.album instanceof Array && + this.album.length > 0) { + for (let i = 0; i < this.album.length; i++) { + // check whether each _nside + // album has src data or not + if (this.album[i].src) { + continue; + } + throw new Error('One of the album data does not have source data'); + } + } + else { + throw new Error('No album data or album data is not correct in type'); + } + // to prevent data understand as string + // convert it to number + if (isNaN(this.currentImageIndex)) { + throw new Error('Current image index is not a number'); + } + else { + this.currentImageIndex = Number(this.currentImageIndex); + } + return true; + } + _registerImageLoadingEvent() { + const src = this.album[this.currentImageIndex].src; + if (this.album[this.currentImageIndex].iframe || this.needsIframe(src)) { + setTimeout(() => { + this._onLoadImageSuccess(); + }); + return; + } + const preloader = new Image(); + preloader.onload = () => { + this._onLoadImageSuccess(); + }; + preloader.onerror = (e) => { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.FILE_NOT_FOUND, data: e }); + }; + preloader.src = this._sanitizer.sanitize(SecurityContext.URL, src); + } + /** + * Fire when the image is loaded + */ + _onLoadImageSuccess() { + if (!this.options.disableKeyboardNav) { + // unbind keyboard event during transition + this._disableKeyboardNav(); + } + let imageHeight; + let imageWidth; + let maxImageHeight; + let maxImageWidth; + let windowHeight; + let windowWidth; + let naturalImageWidth; + let naturalImageHeight; + // set default width and height of image to be its natural + imageWidth = naturalImageWidth = this._imageElem ? this._imageElem.nativeElement.naturalWidth : this._windowRef.innerWidth * .8; + imageHeight = naturalImageHeight = this._imageElem ? this._imageElem.nativeElement.naturalHeight : this._windowRef.innerHeight * .8; + if (this.options.fitImageInViewPort) { + windowWidth = this._windowRef.innerWidth; + windowHeight = this._windowRef.innerHeight; + maxImageWidth = windowWidth - this._cssValue.containerLeftPadding - + this._cssValue.containerRightPadding - this._cssValue.imageBorderWidthLeft - + this._cssValue.imageBorderWidthRight - 20; + maxImageHeight = windowHeight - this._cssValue.containerTopPadding - + this._cssValue.containerTopPadding - this._cssValue.imageBorderWidthTop - + this._cssValue.imageBorderWidthBottom - 120; + if (naturalImageWidth > maxImageWidth || naturalImageHeight > maxImageHeight) { + if ((naturalImageWidth / maxImageWidth) > (naturalImageHeight / maxImageHeight)) { + imageWidth = maxImageWidth; + imageHeight = Math.round(naturalImageHeight / (naturalImageWidth / imageWidth)); + } + else { + imageHeight = maxImageHeight; + imageWidth = Math.round(naturalImageWidth / (naturalImageHeight / imageHeight)); + } + } + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'width', `${imageWidth}px`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'height', `${imageHeight}px`); + } + this._sizeContainer(imageWidth, imageHeight); + if (this.options.centerVertically) { + this._centerVertically(imageWidth, imageHeight); + } + } + _centerVertically(imageWidth, imageHeight) { + const scrollOffset = this._documentRef.documentElement.scrollTop; + const windowHeight = this._windowRef.innerHeight; + const viewOffset = windowHeight / 2 - imageHeight / 2; + const topDistance = scrollOffset + viewOffset; + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${topDistance}px`); + } + _sizeContainer(imageWidth, imageHeight) { + const oldWidth = this._outerContainerElem.nativeElement.offsetWidth; + const oldHeight = this._outerContainerElem.nativeElement.offsetHeight; + const newWidth = imageWidth + this._cssValue.containerRightPadding + this._cssValue.containerLeftPadding + + this._cssValue.imageBorderWidthLeft + this._cssValue.imageBorderWidthRight; + const newHeight = imageHeight + this._cssValue.containerTopPadding + this._cssValue.containerBottomPadding + + this._cssValue.imageBorderWidthTop + this._cssValue.imageBorderWidthBottom; + // make sure that distances are large enough for transitionend event to be fired, at least 5px. + if (Math.abs(oldWidth - newWidth) + Math.abs(oldHeight - newHeight) > 5) { + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'width', `${newWidth}px`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'height', `${newHeight}px`); + // bind resize event to outer container + // use enableTransition to prevent infinite loader + if (this.options.enableTransition) { + this._event.transitions = []; + ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd', 'MSTransitionEnd'].forEach(eventName => { + this._event.transitions.push(this._rendererRef.listen(this._outerContainerElem.nativeElement, eventName, (event) => { + if (event.target === event.currentTarget) { + this._postResize(newWidth, newHeight); + } + })); + }); + } + else { + this._postResize(newWidth, newHeight); + } + } + else { + this._postResize(newWidth, newHeight); + } + } + _postResize(newWidth, newHeight) { + // unbind resize event + if (Array.isArray(this._event.transitions)) { + this._event.transitions.forEach((eventHandler) => { + eventHandler(); + }); + this._event.transitions = []; + } + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'width', `${newWidth}px`); + this._showImage(); + } + _showImage() { + this.ui.showReloader = false; + this._updateNav(); + this._updateDetails(); + if (!this.options.disableKeyboardNav) { + this._enableKeyboardNav(); + } + } + _prepareComponent() { + // add css3 animation + this._addCssAnimation(); + // position the image according to user's option + this._positionLightBox(); + // update controls visibility on next view generation + setTimeout(() => { + this.ui.showZoomButton = this.options.showZoom; + this.ui.showRotateButton = this.options.showRotate; + }, 0); + } + _positionLightBox() { + // @see https://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll + const top = (this._windowRef.pageYOffset || this._documentRef.documentElement.scrollTop) + + this.options.positionFromTop; + const left = this._windowRef.pageXOffset || this._documentRef.documentElement.scrollLeft; + if (!this.options.centerVertically) { + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${top}px`); + } + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'left', `${left}px`); + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'display', 'block'); + // disable scrolling of the page while open + if (this.options.disableScrolling) { + this._rendererRef.addClass(this._documentRef.documentElement, 'lb-disable-scrolling'); + } + } + /** + * addCssAnimation add css3 classes for animate lightbox + */ + _addCssAnimation() { + const resizeDuration = this.options.resizeDuration; + const fadeDuration = this.options.fadeDuration; + this._rendererRef.setStyle(this._lightboxElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, '-webkit-transition-duration', `${resizeDuration}s`); + this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'transition-duration', `${resizeDuration}s`); + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._captionElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._captionElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._numberElem.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._numberElem.nativeElement, 'animation-duration', `${fadeDuration}s`); + } + _end() { + this.ui.classList = 'lightbox animation fadeOut'; + if (this.options.disableScrolling) { + this._rendererRef.removeClass(this._documentRef.documentElement, 'lb-disable-scrolling'); + } + setTimeout(() => { + this.cmpRef.destroy(); + }, this.options.fadeDuration * 1000); + } + _updateDetails() { + // update the caption + if (typeof this.album[this.currentImageIndex].caption !== 'undefined' && + this.album[this.currentImageIndex].caption !== '') { + this.ui.showCaption = true; + } + // update the page number if user choose to do so + // does not perform numbering the page if the + // array length in album <= 1 + if (this.album.length > 1 && this.options.showImageNumberLabel) { + this.ui.showPageNumber = true; + this.content.pageNumber = this._albumLabel(); + } + } + _albumLabel() { + // due to {this.currentImageIndex} is set from 0 to {this.album.length} - 1 + return this.options.albumLabel.replace(/%1/g, Number(this.currentImageIndex + 1)).replace(/%2/g, this.album.length); + } + _changeImage(newIndex) { + this._resetImage(); + this.currentImageIndex = newIndex; + this._hideImage(); + this._registerImageLoadingEvent(); + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CHANGE_PAGE, data: newIndex }); + } + _hideImage() { + this.ui.showReloader = true; + this.ui.showArrowNav = false; + this.ui.showLeftArrow = false; + this.ui.showRightArrow = false; + this.ui.showPageNumber = false; + this.ui.showCaption = false; + } + _updateNav() { + let alwaysShowNav = false; + // check to see the browser support touch event + try { + this._documentRef.createEvent('TouchEvent'); + alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false; + } + catch (e) { + // noop + } + // initially show the arrow nav + // which is the parent of both left and right nav + this._showArrowNav(); + if (this.album.length > 1) { + if (this.options.wrapAround) { + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1'); + this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1'); + this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1'); + } + // alternatives this.$lightbox.find('.lb-prev, .lb-next').show(); + this._showLeftArrowNav(); + this._showRightArrowNav(); + } + else { + if (this.currentImageIndex > 0) { + // alternatives this.$lightbox.find('.lb-prev').show(); + this._showLeftArrowNav(); + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-prev').css('opacity', '1'); + this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1'); + } + } + if (this.currentImageIndex < this.album.length - 1) { + // alternatives this.$lightbox.find('.lb-next').show(); + this._showRightArrowNav(); + if (alwaysShowNav) { + // alternatives this.$lightbox.find('.lb-next').css('opacity', '1'); + this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1'); + } + } + } + } + } + _showLeftArrowNav() { + this.ui.showLeftArrow = true; + } + _showRightArrowNav() { + this.ui.showRightArrow = true; + } + _showArrowNav() { + this.ui.showArrowNav = (this.album.length !== 1); + } + _enableKeyboardNav() { + this._event.keyup = this._rendererRef.listen('document', 'keyup', (event) => { + this._keyboardAction(event); + }); + } + _disableKeyboardNav() { + if (this._event.keyup) { + this._event.keyup(); + } + } + _keyboardAction($event) { + const KEYCODE_ESC = 27; + const KEYCODE_LEFTARROW = 37; + const KEYCODE_RIGHTARROW = 39; + const keycode = $event.keyCode; + const key = String.fromCharCode(keycode).toLowerCase(); + if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + else if (key === 'p' || keycode === KEYCODE_LEFTARROW) { + if (this.currentImageIndex !== 0) { + this._changeImage(this.currentImageIndex - 1); + } + else if (this.options.wrapAround && this.album.length > 1) { + this._changeImage(this.album.length - 1); + } + } + else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) { + if (this.currentImageIndex !== this.album.length - 1) { + this._changeImage(this.currentImageIndex + 1); + } + else if (this.options.wrapAround && this.album.length > 1) { + this._changeImage(0); + } + } + } + _getCssStyleValue(elem, propertyName) { + return parseFloat(this._windowRef + .getComputedStyle(elem.nativeElement, null) + .getPropertyValue(propertyName)); + } + _onReceivedEvent(event) { + switch (event.id) { + case LIGHTBOX_EVENT.CLOSE: + this._end(); + break; + default: + break; + } + } + needsIframe(src) { + // const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, src); + if (src.match(/\.pdf$/)) { + return true; + } + return false; + } +} +LightboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: LightboxEvent }, { token: i0.ElementRef }, { token: LightboxWindowRef }, { token: i1.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); +LightboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: LightboxComponent, selector: "[lb-content]", inputs: { album: "album", currentImageIndex: "currentImageIndex", options: "options", cmpRef: "cmpRef" }, host: { listeners: { "close": "close($event)" }, properties: { "class": "ui.classList" } }, viewQueries: [{ propertyName: "_outerContainerElem", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "_containerElem", first: true, predicate: ["container"], descendants: true }, { propertyName: "_leftArrowElem", first: true, predicate: ["leftArrow"], descendants: true }, { propertyName: "_rightArrowElem", first: true, predicate: ["rightArrow"], descendants: true }, { propertyName: "_navArrowElem", first: true, predicate: ["navArrow"], descendants: true }, { propertyName: "_dataContainerElem", first: true, predicate: ["dataContainer"], descendants: true }, { propertyName: "_imageElem", first: true, predicate: ["image"], descendants: true }, { propertyName: "_iframeElem", first: true, predicate: ["iframe"], descendants: true }, { propertyName: "_captionElem", first: true, predicate: ["caption"], descendants: true }, { propertyName: "_numberElem", first: true, predicate: ["number"], descendants: true }], ngImport: i0, template: "
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
", directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "safe": SafePipe } }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxComponent, decorators: [{ + type: Component, + args: [{ selector: '[lb-content]', host: { + '[class]': 'ui.classList' + }, template: "
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
" }] + }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: LightboxEvent }, { type: i0.ElementRef }, { type: LightboxWindowRef }, { type: i1.DomSanitizer }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; }, propDecorators: { album: [{ + type: Input + }], currentImageIndex: [{ + type: Input + }], options: [{ + type: Input + }], cmpRef: [{ + type: Input + }], _outerContainerElem: [{ + type: ViewChild, + args: ['outerContainer'] + }], _containerElem: [{ + type: ViewChild, + args: ['container'] + }], _leftArrowElem: [{ + type: ViewChild, + args: ['leftArrow'] + }], _rightArrowElem: [{ + type: ViewChild, + args: ['rightArrow'] + }], _navArrowElem: [{ + type: ViewChild, + args: ['navArrow'] + }], _dataContainerElem: [{ + type: ViewChild, + args: ['dataContainer'] + }], _imageElem: [{ + type: ViewChild, + args: ['image'] + }], _iframeElem: [{ + type: ViewChild, + args: ['iframe'] + }], _captionElem: [{ + type: ViewChild, + args: ['caption'] + }], _numberElem: [{ + type: ViewChild, + args: ['number'] + }], close: [{ + type: HostListener, + args: ['close', ['$event']] + }] } }); + +class LightboxOverlayComponent { + constructor(_elemRef, _rendererRef, _lightboxEvent, _documentRef) { + this._elemRef = _elemRef; + this._rendererRef = _rendererRef; + this._lightboxEvent = _lightboxEvent; + this._documentRef = _documentRef; + this.classList = 'lightboxOverlay animation fadeInOverlay'; + this._subscription = this._lightboxEvent.lightboxEvent$.subscribe((event) => this._onReceivedEvent(event)); + } + close() { + // broadcast to itself and all others subscriber including the components + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null }); + } + ngAfterViewInit() { + const fadeDuration = this.options.fadeDuration; + this._rendererRef.setStyle(this._elemRef.nativeElement, '-webkit-animation-duration', `${fadeDuration}s`); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'animation-duration', `${fadeDuration}s`); + this._sizeOverlay(); + } + onResize() { + this._sizeOverlay(); + } + ngOnDestroy() { + this._subscription.unsubscribe(); + } + _sizeOverlay() { + const width = this._getOverlayWidth(); + const height = this._getOverlayHeight(); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'width', `${width}px`); + this._rendererRef.setStyle(this._elemRef.nativeElement, 'height', `${height}px`); + } + _onReceivedEvent(event) { + switch (event.id) { + case LIGHTBOX_EVENT.CLOSE: + this._end(); + break; + default: + break; + } + } + _end() { + this.classList = 'lightboxOverlay animation fadeOutOverlay'; + // queue self destruction after the animation has finished + // FIXME: not sure if there is any way better than this + setTimeout(() => { + this.cmpRef.destroy(); + }, this.options.fadeDuration * 1000); + } + _getOverlayWidth() { + return Math.max(this._documentRef.body.scrollWidth, this._documentRef.body.offsetWidth, this._documentRef.documentElement.clientWidth, this._documentRef.documentElement.scrollWidth, this._documentRef.documentElement.offsetWidth); + } + _getOverlayHeight() { + return Math.max(this._documentRef.body.scrollHeight, this._documentRef.body.offsetHeight, this._documentRef.documentElement.clientHeight, this._documentRef.documentElement.scrollHeight, this._documentRef.documentElement.offsetHeight); + } +} +LightboxOverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxOverlayComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: LightboxEvent }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); +LightboxOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: LightboxOverlayComponent, selector: "[lb-overlay]", inputs: { options: "options", cmpRef: "cmpRef" }, host: { listeners: { "click": "close()", "window:resize": "onResize()" }, properties: { "class": "classList" } }, ngImport: i0, template: '', isInline: true }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxOverlayComponent, decorators: [{ + type: Component, + args: [{ + selector: '[lb-overlay]', + template: '', + host: { + '[class]': 'classList' + } + }] + }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: LightboxEvent }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; }, propDecorators: { options: [{ + type: Input + }], cmpRef: [{ + type: Input + }], close: [{ + type: HostListener, + args: ['click'] + }], onResize: [{ + type: HostListener, + args: ['window:resize'] + }] } }); + +class LightboxConfig { + constructor() { + this.fadeDuration = 0.7; + this.resizeDuration = 0.5; + this.fitImageInViewPort = true; + this.positionFromTop = 20; + this.showImageNumberLabel = false; + this.alwaysShowNavOnTouchDevices = false; + this.wrapAround = false; + this.disableKeyboardNav = false; + this.disableScrolling = false; + this.centerVertically = false; + this.enableTransition = true; + this.albumLabel = 'Image %1 of %2'; + this.showZoom = false; + this.showRotate = false; + this.containerElementResolver = (documentRef) => documentRef.querySelector('body'); + } +} +LightboxConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); +LightboxConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxConfig, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return []; } }); + +class Lightbox { + constructor(_componentFactoryResolver, _injector, _applicationRef, _lightboxConfig, _lightboxEvent, _documentRef) { + this._componentFactoryResolver = _componentFactoryResolver; + this._injector = _injector; + this._applicationRef = _applicationRef; + this._lightboxConfig = _lightboxConfig; + this._lightboxEvent = _lightboxEvent; + this._documentRef = _documentRef; + } + open(album, curIndex = 0, options = {}) { + const overlayComponentRef = this._createComponent(LightboxOverlayComponent); + const componentRef = this._createComponent(LightboxComponent); + const newOptions = {}; + // broadcast open event + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.OPEN }); + Object.assign(newOptions, this._lightboxConfig, options); + // attach input to lightbox + componentRef.instance.album = album; + componentRef.instance.currentImageIndex = curIndex; + componentRef.instance.options = newOptions; + componentRef.instance.cmpRef = componentRef; + // attach input to overlay + overlayComponentRef.instance.options = newOptions; + overlayComponentRef.instance.cmpRef = overlayComponentRef; + // FIXME: not sure why last event is broadcasted (which is CLOSED) and make + // lightbox can not be opened the second time. + // Need to timeout so that the OPEN event is set before component is initialized + setTimeout(() => { + this._applicationRef.attachView(overlayComponentRef.hostView); + this._applicationRef.attachView(componentRef.hostView); + overlayComponentRef.onDestroy(() => { + this._applicationRef.detachView(overlayComponentRef.hostView); + }); + componentRef.onDestroy(() => { + this._applicationRef.detachView(componentRef.hostView); + }); + const containerElement = newOptions.containerElementResolver(this._documentRef); + containerElement.appendChild(overlayComponentRef.location.nativeElement); + containerElement.appendChild(componentRef.location.nativeElement); + }); + } + close() { + if (this._lightboxEvent) { + this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE }); + } + } + _createComponent(ComponentClass) { + const factory = this._componentFactoryResolver.resolveComponentFactory(ComponentClass); + const component = factory.create(this._injector); + return component; + } +} +Lightbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: LightboxConfig }, { token: LightboxEvent }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); +Lightbox.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, providedIn: 'root' }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Lightbox, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root' + }] + }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: LightboxConfig }, { type: LightboxEvent }, { type: undefined, decorators: [{ + type: Inject, + args: [DOCUMENT] + }] }]; } }); + +class LightboxModule { +} +LightboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); +LightboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe], imports: [CommonModule] }); +LightboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, providers: [ + Lightbox, + LightboxConfig, + LightboxEvent, + LightboxWindowRef + ], imports: [[CommonModule]] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LightboxModule, decorators: [{ + type: NgModule, + args: [{ + imports: [CommonModule], + declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe], + providers: [ + Lightbox, + LightboxConfig, + LightboxEvent, + LightboxWindowRef + ] + }] + }] }); + +/** + * Generated bundle index. Do not edit. + */ + +export { LIGHTBOX_EVENT, Lightbox, LightboxConfig, LightboxEvent, LightboxModule, LightboxWindowRef }; +//# sourceMappingURL=ngx-lightbox.mjs.map diff --git a/fesm2020/ngx-lightbox.mjs.map b/fesm2020/ngx-lightbox.mjs.map new file mode 100644 index 0000000..4d76aa6 --- /dev/null +++ b/fesm2020/ngx-lightbox.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"ngx-lightbox.mjs","sources":["../../../projects/ngx-lightbox/src/lib/lightbox-event.service.ts","../../../projects/ngx-lightbox/src/lib/lightbox.component.ts","../../../projects/ngx-lightbox/src/lib/lightbox.component.html","../../../projects/ngx-lightbox/src/lib/lightbox-overlay.component.ts","../../../projects/ngx-lightbox/src/lib/lightbox-config.service.ts","../../../projects/ngx-lightbox/src/lib/lightbox.service.ts","../../../projects/ngx-lightbox/src/lib/lightbox.module.ts","../../../projects/ngx-lightbox/src/ngx-lightbox.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\r\n\r\nimport { Injectable} from '@angular/core';\r\n\r\nexport interface IEvent {\r\n id: number;\r\n data?: any;\r\n}\r\n\r\nexport interface IAlbum {\r\n src: string;\r\n caption?: string;\r\n thumb: string;\r\n iframe?: boolean;\r\n}\r\n\r\nexport const LIGHTBOX_EVENT = {\r\n CHANGE_PAGE: 1,\r\n CLOSE: 2,\r\n OPEN: 3,\r\n ZOOM_IN: 4,\r\n ZOOM_OUT: 5,\r\n ROTATE_LEFT: 6,\r\n ROTATE_RIGHT: 7,\r\n FILE_NOT_FOUND: 8\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LightboxEvent {\r\n private _lightboxEventSource: Subject;\r\n public lightboxEvent$: Observable;\r\n constructor() {\r\n this._lightboxEventSource = new Subject();\r\n this.lightboxEvent$ = this._lightboxEventSource.asObservable();\r\n }\r\n\r\n broadcastLightboxEvent(event: any): void {\r\n this._lightboxEventSource.next(event);\r\n }\r\n}\r\n\r\nfunction getWindow (): any {\r\n return window;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LightboxWindowRef {\r\n get nativeWindow (): any {\r\n return getWindow();\r\n }\r\n}\r\n","import {DOCUMENT} from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit, Pipe, PipeTransform,\r\n Renderer2,\r\n SecurityContext,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {DomSanitizer} from '@angular/platform-browser';\r\n\r\nimport {IAlbum, IEvent, LIGHTBOX_EVENT, LightboxEvent, LightboxWindowRef} from './lightbox-event.service';\r\n\r\n@Pipe({ name: 'safe' })\r\nexport class SafePipe implements PipeTransform {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n transform(url) {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: '[lb-content]',\r\n host: {\r\n '[class]': 'ui.classList'\r\n },\r\n templateUrl: \"./lightbox.component.html\",\r\n})\r\nexport class LightboxComponent implements OnInit, AfterViewInit, OnDestroy, OnInit {\r\n @Input() album: Array;\r\n @Input() currentImageIndex: number;\r\n @Input() options: any;\r\n @Input() cmpRef: any;\r\n @ViewChild('outerContainer') _outerContainerElem: ElementRef;\r\n @ViewChild('container') _containerElem: ElementRef;\r\n @ViewChild('leftArrow') _leftArrowElem: ElementRef;\r\n @ViewChild('rightArrow') _rightArrowElem: ElementRef;\r\n @ViewChild('navArrow') _navArrowElem: ElementRef;\r\n @ViewChild('dataContainer') _dataContainerElem: ElementRef;\r\n @ViewChild('image') _imageElem: ElementRef;\r\n @ViewChild('iframe') _iframeElem: ElementRef;\r\n @ViewChild('caption') _captionElem: ElementRef;\r\n @ViewChild('number') _numberElem: ElementRef;\r\n public content: any;\r\n public ui: any;\r\n private _cssValue: any;\r\n private _event: any;\r\n private _windowRef: any;\r\n private rotate: number;\r\n constructor(\r\n private _elemRef: ElementRef,\r\n private _rendererRef: Renderer2,\r\n private _lightboxEvent: LightboxEvent,\r\n public _lightboxElem: ElementRef,\r\n private _lightboxWindowRef: LightboxWindowRef,\r\n private _sanitizer: DomSanitizer,\r\n @Inject(DOCUMENT) private _documentRef\r\n ) {\r\n // initialize data\r\n this.options = this.options || {};\r\n this.album = this.album || [];\r\n this.currentImageIndex = this.currentImageIndex || 0;\r\n this._windowRef = this._lightboxWindowRef.nativeWindow;\r\n\r\n // control the interactive of the directive\r\n this.ui = {\r\n // control the appear of the reloader\r\n // false: image has loaded completely and ready to be shown\r\n // true: image is still loading\r\n showReloader: true,\r\n\r\n // control the appear of the nav arrow\r\n // the arrowNav is the parent of both left and right arrow\r\n // in some cases, the parent shows but the child does not show\r\n showLeftArrow: false,\r\n showRightArrow: false,\r\n showArrowNav: false,\r\n\r\n // control the appear of the zoom and rotate buttons\r\n showZoomButton: false,\r\n showRotateButton: false,\r\n\r\n // control whether to show the\r\n // page number or not\r\n showPageNumber: false,\r\n showCaption: false,\r\n classList: 'lightbox animation fadeIn'\r\n };\r\n\r\n this.content = {\r\n pageNumber: ''\r\n };\r\n\r\n this._event = {};\r\n this._lightboxElem = this._elemRef;\r\n this._event.subscription = this._lightboxEvent.lightboxEvent$\r\n .subscribe((event: IEvent) => this._onReceivedEvent(event));\r\n this.rotate = 0;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.album.forEach(album => {\r\n if (album.caption) {\r\n album.caption = this._sanitizer.sanitize(SecurityContext.HTML, album.caption);\r\n }\r\n });\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // need to init css value here, after the view ready\r\n // actually these values are always 0\r\n this._cssValue = {\r\n containerTopPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-top')),\r\n containerRightPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-right')),\r\n containerBottomPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-bottom')),\r\n containerLeftPadding: Math.round(this._getCssStyleValue(this._containerElem, 'padding-left')),\r\n imageBorderWidthTop: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-top-width')),\r\n imageBorderWidthBottom: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-bottom-width')),\r\n imageBorderWidthLeft: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-left-width')),\r\n imageBorderWidthRight: Math.round(this._getCssStyleValue(this._imageElem || this._iframeElem, 'border-right-width'))\r\n };\r\n\r\n if (this._validateInputData()) {\r\n this._prepareComponent();\r\n this._registerImageLoadingEvent();\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (!this.options.disableKeyboardNav) {\r\n // unbind keyboard event\r\n this._disableKeyboardNav();\r\n }\r\n\r\n this._event.subscription.unsubscribe();\r\n }\r\n\r\n @HostListener('close', ['$event'])\r\n public close($event: any): void {\r\n $event.stopPropagation();\r\n if ($event.target.classList.contains('lightbox') ||\r\n $event.target.classList.contains('lb-loader') ||\r\n $event.target.classList.contains('lb-close')) {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null });\r\n }\r\n }\r\n\r\n public control($event: any): void {\r\n $event.stopPropagation();\r\n let height: number;\r\n let width: number;\r\n if ($event.target.classList.contains('lb-turnLeft')) {\r\n this.rotate = this.rotate - 90;\r\n this._rotateContainer();\r\n this._calcTransformPoint();\r\n this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`;\r\n this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`;\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_LEFT, data: null });\r\n } else if ($event.target.classList.contains('lb-turnRight')) {\r\n this.rotate = this.rotate + 90;\r\n this._rotateContainer();\r\n this._calcTransformPoint();\r\n this._documentRef.getElementById('image').style.transform = `rotate(${this.rotate}deg)`;\r\n this._documentRef.getElementById('image').style.webkitTransform = `rotate(${this.rotate}deg)`;\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ROTATE_RIGHT, data: null });\r\n } else if ($event.target.classList.contains('lb-zoomOut')) {\r\n height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) / 1.5;\r\n width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) / 1.5;\r\n this._documentRef.getElementById('outerContainer').style.height = height + 'px';\r\n this._documentRef.getElementById('outerContainer').style.width = width + 'px';\r\n height = parseInt(this._documentRef.getElementById('image').style.height, 10) / 1.5;\r\n width = parseInt(this._documentRef.getElementById('image').style.width, 10) / 1.5;\r\n this._documentRef.getElementById('image').style.height = height + 'px';\r\n this._documentRef.getElementById('image').style.width = width + 'px';\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_OUT, data: null });\r\n } else if ($event.target.classList.contains('lb-zoomIn')) {\r\n height = parseInt(this._documentRef.getElementById('outerContainer').style.height, 10) * 1.5;\r\n width = parseInt(this._documentRef.getElementById('outerContainer').style.width, 10) * 1.5;\r\n this._documentRef.getElementById('outerContainer').style.height = height + 'px';\r\n this._documentRef.getElementById('outerContainer').style.width = width + 'px';\r\n height = parseInt(this._documentRef.getElementById('image').style.height, 10) * 1.5;\r\n width = parseInt(this._documentRef.getElementById('image').style.width, 10) * 1.5;\r\n this._documentRef.getElementById('image').style.height = height + 'px';\r\n this._documentRef.getElementById('image').style.width = width + 'px';\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.ZOOM_IN, data: null });\r\n }\r\n }\r\n\r\n private _rotateContainer(): void {\r\n let temp = this.rotate;\r\n if (temp < 0) {\r\n temp *= -1;\r\n }\r\n if (temp / 90 % 4 === 1 || temp / 90 % 4 === 3) {\r\n this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.height;\r\n this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height;\r\n } else {\r\n this._documentRef.getElementById('outerContainer').style.height = this._documentRef.getElementById('image').style.height;\r\n this._documentRef.getElementById('outerContainer').style.width = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('container').style.height = this._documentRef.getElementById('image').style.width;\r\n this._documentRef.getElementById('container').style.width = this._documentRef.getElementById('image').style.height;\r\n }\r\n }\r\n\r\n private _resetImage(): void {\r\n this.rotate = 0;\r\n const image = this._documentRef.getElementById('image');\r\n if (image) {\r\n image.style.transform = `rotate(${this.rotate}deg)`;\r\n image.style.webkitTransform = `rotate(${this.rotate}deg)`;\r\n }\r\n\r\n }\r\n\r\n private _calcTransformPoint(): void {\r\n let height = parseInt(this._documentRef.getElementById('image').style.height, 10);\r\n let width = parseInt(this._documentRef.getElementById('image').style.width, 10);\r\n let temp = this.rotate % 360;\r\n if (temp < 0) {\r\n temp = 360 + temp;\r\n }\r\n if (temp === 90) {\r\n this._documentRef.getElementById('image').style.transformOrigin = (height / 2) + 'px ' + (height / 2) + 'px';\r\n } else if (temp === 180) {\r\n this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (height / 2) + 'px';\r\n } else if (temp === 270) {\r\n this._documentRef.getElementById('image').style.transformOrigin = (width / 2) + 'px ' + (width / 2) + 'px';\r\n }\r\n }\r\n\r\n public nextImage(): void {\r\n if (this.album.length === 1) {\r\n return;\r\n } else if (this.currentImageIndex === this.album.length - 1) {\r\n this._changeImage(0);\r\n } else {\r\n this._changeImage(this.currentImageIndex + 1);\r\n }\r\n }\r\n\r\n public prevImage(): void {\r\n if (this.album.length === 1) {\r\n return;\r\n } else if (this.currentImageIndex === 0 && this.album.length > 1) {\r\n this._changeImage(this.album.length - 1);\r\n } else {\r\n this._changeImage(this.currentImageIndex - 1);\r\n }\r\n }\r\n\r\n private _validateInputData(): boolean {\r\n if (this.album &&\r\n this.album instanceof Array &&\r\n this.album.length > 0) {\r\n for (let i = 0; i < this.album.length; i++) {\r\n // check whether each _nside\r\n // album has src data or not\r\n if (this.album[i].src) {\r\n continue;\r\n }\r\n\r\n throw new Error('One of the album data does not have source data');\r\n }\r\n } else {\r\n throw new Error('No album data or album data is not correct in type');\r\n }\r\n\r\n // to prevent data understand as string\r\n // convert it to number\r\n if (isNaN(this.currentImageIndex)) {\r\n throw new Error('Current image index is not a number');\r\n } else {\r\n this.currentImageIndex = Number(this.currentImageIndex);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _registerImageLoadingEvent(): void {\r\n const src: any = this.album[this.currentImageIndex].src;\r\n\r\n if (this.album[this.currentImageIndex].iframe || this.needsIframe(src)) {\r\n setTimeout( () => {\r\n this._onLoadImageSuccess();\r\n });\r\n return;\r\n }\r\n\r\n const preloader = new Image();\r\n\r\n preloader.onload = () => {\r\n this._onLoadImageSuccess();\r\n }\r\n\r\n preloader.onerror = (e) => {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.FILE_NOT_FOUND, data: e });\r\n }\r\n\r\n preloader.src = this._sanitizer.sanitize(SecurityContext.URL, src);\r\n }\r\n\r\n /**\r\n * Fire when the image is loaded\r\n */\r\n private _onLoadImageSuccess(): void {\r\n if (!this.options.disableKeyboardNav) {\r\n // unbind keyboard event during transition\r\n this._disableKeyboardNav();\r\n }\r\n\r\n let imageHeight;\r\n let imageWidth;\r\n let maxImageHeight;\r\n let maxImageWidth;\r\n let windowHeight;\r\n let windowWidth;\r\n let naturalImageWidth;\r\n let naturalImageHeight;\r\n\r\n // set default width and height of image to be its natural\r\n imageWidth = naturalImageWidth = this._imageElem ? this._imageElem.nativeElement.naturalWidth : this._windowRef.innerWidth * .8;\r\n imageHeight = naturalImageHeight = this._imageElem ? this._imageElem.nativeElement.naturalHeight : this._windowRef.innerHeight * .8;\r\n if (this.options.fitImageInViewPort) {\r\n windowWidth = this._windowRef.innerWidth;\r\n windowHeight = this._windowRef.innerHeight;\r\n maxImageWidth = windowWidth - this._cssValue.containerLeftPadding -\r\n this._cssValue.containerRightPadding - this._cssValue.imageBorderWidthLeft -\r\n this._cssValue.imageBorderWidthRight - 20;\r\n maxImageHeight = windowHeight - this._cssValue.containerTopPadding -\r\n this._cssValue.containerTopPadding - this._cssValue.imageBorderWidthTop -\r\n this._cssValue.imageBorderWidthBottom - 120;\r\n if (naturalImageWidth > maxImageWidth || naturalImageHeight > maxImageHeight) {\r\n if ((naturalImageWidth / maxImageWidth) > (naturalImageHeight / maxImageHeight)) {\r\n imageWidth = maxImageWidth;\r\n imageHeight = Math.round(naturalImageHeight / (naturalImageWidth / imageWidth));\r\n } else {\r\n imageHeight = maxImageHeight;\r\n imageWidth = Math.round(naturalImageWidth / (naturalImageHeight / imageHeight));\r\n }\r\n }\r\n\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'width', `${imageWidth}px`);\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement, 'height', `${imageHeight}px`);\r\n }\r\n\r\n this._sizeContainer(imageWidth, imageHeight);\r\n\r\n if (this.options.centerVertically) {\r\n this._centerVertically(imageWidth, imageHeight);\r\n }\r\n }\r\n\r\n private _centerVertically(imageWidth: number, imageHeight: number): void {\r\n const scrollOffset = this._documentRef.documentElement.scrollTop;\r\n const windowHeight = this._windowRef.innerHeight;\r\n\r\n const viewOffset = windowHeight / 2 - imageHeight / 2;\r\n const topDistance = scrollOffset + viewOffset;\r\n\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${topDistance}px`);\r\n }\r\n\r\n private _sizeContainer(imageWidth: number, imageHeight: number): void {\r\n const oldWidth = this._outerContainerElem.nativeElement.offsetWidth;\r\n const oldHeight = this._outerContainerElem.nativeElement.offsetHeight;\r\n const newWidth = imageWidth + this._cssValue.containerRightPadding + this._cssValue.containerLeftPadding +\r\n this._cssValue.imageBorderWidthLeft + this._cssValue.imageBorderWidthRight;\r\n const newHeight = imageHeight + this._cssValue.containerTopPadding + this._cssValue.containerBottomPadding +\r\n this._cssValue.imageBorderWidthTop + this._cssValue.imageBorderWidthBottom;\r\n\r\n // make sure that distances are large enough for transitionend event to be fired, at least 5px.\r\n if (Math.abs(oldWidth - newWidth) + Math.abs(oldHeight - newHeight) > 5) {\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'width', `${newWidth}px`);\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement, 'height', `${newHeight}px`);\r\n\r\n // bind resize event to outer container\r\n // use enableTransition to prevent infinite loader\r\n if (this.options.enableTransition) {\r\n this._event.transitions = [];\r\n ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd', 'MSTransitionEnd'].forEach(eventName => {\r\n this._event.transitions.push(\r\n this._rendererRef.listen(this._outerContainerElem.nativeElement, eventName, (event: any) => {\r\n if (event.target === event.currentTarget) {\r\n this._postResize(newWidth, newHeight);\r\n }\r\n })\r\n );\r\n });\r\n } else {\r\n this._postResize(newWidth, newHeight);\r\n }\r\n } else {\r\n this._postResize(newWidth, newHeight);\r\n }\r\n }\r\n\r\n private _postResize(newWidth: number, newHeight: number): void {\r\n // unbind resize event\r\n if (Array.isArray(this._event.transitions)) {\r\n this._event.transitions.forEach((eventHandler: any) => {\r\n eventHandler();\r\n });\r\n\r\n this._event.transitions = [];\r\n }\r\n\r\n this._rendererRef.setStyle(this._dataContainerElem.nativeElement, 'width', `${newWidth}px`);\r\n this._showImage();\r\n }\r\n\r\n private _showImage(): void {\r\n this.ui.showReloader = false;\r\n this._updateNav();\r\n this._updateDetails();\r\n if (!this.options.disableKeyboardNav) {\r\n this._enableKeyboardNav();\r\n }\r\n }\r\n\r\n private _prepareComponent(): void {\r\n // add css3 animation\r\n this._addCssAnimation();\r\n\r\n // position the image according to user's option\r\n this._positionLightBox();\r\n\r\n // update controls visibility on next view generation\r\n setTimeout(() => {\r\n this.ui.showZoomButton = this.options.showZoom;\r\n this.ui.showRotateButton = this.options.showRotate;\r\n }, 0);\r\n }\r\n\r\n private _positionLightBox(): void {\r\n // @see https://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll\r\n const top = (this._windowRef.pageYOffset || this._documentRef.documentElement.scrollTop) +\r\n this.options.positionFromTop;\r\n const left = this._windowRef.pageXOffset || this._documentRef.documentElement.scrollLeft;\r\n\r\n if (!this.options.centerVertically) {\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'top', `${top}px`);\r\n }\r\n\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'left', `${left}px`);\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement, 'display', 'block');\r\n\r\n // disable scrolling of the page while open\r\n if (this.options.disableScrolling) {\r\n this._rendererRef.addClass(this._documentRef.documentElement, 'lb-disable-scrolling');\r\n }\r\n }\r\n\r\n /**\r\n * addCssAnimation add css3 classes for animate lightbox\r\n */\r\n private _addCssAnimation(): void {\r\n const resizeDuration = this.options.resizeDuration;\r\n const fadeDuration = this.options.fadeDuration;\r\n\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._lightboxElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement,\r\n '-webkit-transition-duration', `${resizeDuration}s`);\r\n this._rendererRef.setStyle(this._outerContainerElem.nativeElement,\r\n 'transition-duration', `${resizeDuration}s`);\r\n this._rendererRef.setStyle(this._dataContainerElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._dataContainerElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle((this._imageElem || this._iframeElem).nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._captionElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._captionElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._numberElem.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._numberElem.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n }\r\n\r\n private _end(): void {\r\n this.ui.classList = 'lightbox animation fadeOut';\r\n if (this.options.disableScrolling) {\r\n this._rendererRef.removeClass(this._documentRef.documentElement, 'lb-disable-scrolling');\r\n }\r\n setTimeout(() => {\r\n this.cmpRef.destroy();\r\n }, this.options.fadeDuration * 1000);\r\n }\r\n\r\n private _updateDetails(): void {\r\n // update the caption\r\n if (typeof this.album[this.currentImageIndex].caption !== 'undefined' &&\r\n this.album[this.currentImageIndex].caption !== '') {\r\n this.ui.showCaption = true;\r\n }\r\n\r\n // update the page number if user choose to do so\r\n // does not perform numbering the page if the\r\n // array length in album <= 1\r\n if (this.album.length > 1 && this.options.showImageNumberLabel) {\r\n this.ui.showPageNumber = true;\r\n this.content.pageNumber = this._albumLabel();\r\n }\r\n }\r\n\r\n private _albumLabel(): string {\r\n // due to {this.currentImageIndex} is set from 0 to {this.album.length} - 1\r\n return this.options.albumLabel.replace(/%1/g, Number(this.currentImageIndex + 1)).replace(/%2/g, this.album.length);\r\n }\r\n\r\n private _changeImage(newIndex: number): void {\r\n this._resetImage();\r\n this.currentImageIndex = newIndex;\r\n this._hideImage();\r\n this._registerImageLoadingEvent();\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CHANGE_PAGE, data: newIndex });\r\n }\r\n\r\n private _hideImage(): void {\r\n this.ui.showReloader = true;\r\n this.ui.showArrowNav = false;\r\n this.ui.showLeftArrow = false;\r\n this.ui.showRightArrow = false;\r\n this.ui.showPageNumber = false;\r\n this.ui.showCaption = false;\r\n }\r\n\r\n private _updateNav(): void {\r\n let alwaysShowNav = false;\r\n\r\n // check to see the browser support touch event\r\n try {\r\n this._documentRef.createEvent('TouchEvent');\r\n alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;\r\n } catch (e) {\r\n // noop\r\n }\r\n\r\n // initially show the arrow nav\r\n // which is the parent of both left and right nav\r\n this._showArrowNav();\r\n if (this.album.length > 1) {\r\n if (this.options.wrapAround) {\r\n if (alwaysShowNav) {\r\n // alternatives this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');\r\n this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1');\r\n this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1');\r\n }\r\n\r\n // alternatives this.$lightbox.find('.lb-prev, .lb-next').show();\r\n this._showLeftArrowNav();\r\n this._showRightArrowNav();\r\n } else {\r\n if (this.currentImageIndex > 0) {\r\n // alternatives this.$lightbox.find('.lb-prev').show();\r\n this._showLeftArrowNav();\r\n if (alwaysShowNav) {\r\n // alternatives this.$lightbox.find('.lb-prev').css('opacity', '1');\r\n this._rendererRef.setStyle(this._leftArrowElem.nativeElement, 'opacity', '1');\r\n }\r\n }\r\n\r\n if (this.currentImageIndex < this.album.length - 1) {\r\n // alternatives this.$lightbox.find('.lb-next').show();\r\n this._showRightArrowNav();\r\n if (alwaysShowNav) {\r\n // alternatives this.$lightbox.find('.lb-next').css('opacity', '1');\r\n this._rendererRef.setStyle(this._rightArrowElem.nativeElement, 'opacity', '1');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _showLeftArrowNav(): void {\r\n this.ui.showLeftArrow = true;\r\n }\r\n\r\n private _showRightArrowNav(): void {\r\n this.ui.showRightArrow = true;\r\n }\r\n\r\n private _showArrowNav(): void {\r\n this.ui.showArrowNav = (this.album.length !== 1);\r\n }\r\n\r\n private _enableKeyboardNav(): void {\r\n this._event.keyup = this._rendererRef.listen('document', 'keyup', (event: any) => {\r\n this._keyboardAction(event);\r\n });\r\n }\r\n\r\n private _disableKeyboardNav(): void {\r\n if (this._event.keyup) {\r\n this._event.keyup();\r\n }\r\n }\r\n\r\n private _keyboardAction($event: any): void {\r\n const KEYCODE_ESC = 27;\r\n const KEYCODE_LEFTARROW = 37;\r\n const KEYCODE_RIGHTARROW = 39;\r\n const keycode = $event.keyCode;\r\n const key = String.fromCharCode(keycode).toLowerCase();\r\n\r\n if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null });\r\n } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {\r\n if (this.currentImageIndex !== 0) {\r\n this._changeImage(this.currentImageIndex - 1);\r\n } else if (this.options.wrapAround && this.album.length > 1) {\r\n this._changeImage(this.album.length - 1);\r\n }\r\n } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {\r\n if (this.currentImageIndex !== this.album.length - 1) {\r\n this._changeImage(this.currentImageIndex + 1);\r\n } else if (this.options.wrapAround && this.album.length > 1) {\r\n this._changeImage(0);\r\n }\r\n }\r\n }\r\n\r\n private _getCssStyleValue(elem: any, propertyName: string): number {\r\n return parseFloat(this._windowRef\r\n .getComputedStyle(elem.nativeElement, null)\r\n .getPropertyValue(propertyName));\r\n }\r\n\r\n private _onReceivedEvent(event: IEvent): void {\r\n switch (event.id) {\r\n case LIGHTBOX_EVENT.CLOSE:\r\n this._end();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n public needsIframe(src: string) {\r\n // const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, src);\r\n if (src.match(/\\.pdf$/)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{ content.pageNumber\r\n }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
","import { Subscription } from 'rxjs';\r\n\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2\r\n} from '@angular/core';\r\n\r\nimport { IEvent, LIGHTBOX_EVENT, LightboxEvent } from './lightbox-event.service';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Component({\r\n selector: '[lb-overlay]',\r\n template: '',\r\n host: {\r\n '[class]': 'classList'\r\n }\r\n})\r\nexport class LightboxOverlayComponent implements AfterViewInit, OnDestroy {\r\n @Input() options: any;\r\n @Input() cmpRef: any;\r\n public classList;\r\n private _subscription: Subscription;\r\n constructor(\r\n private _elemRef: ElementRef,\r\n private _rendererRef: Renderer2,\r\n private _lightboxEvent: LightboxEvent,\r\n @Inject(DOCUMENT) private _documentRef,\r\n ) {\r\n this.classList = 'lightboxOverlay animation fadeInOverlay';\r\n this._subscription = this._lightboxEvent.lightboxEvent$.subscribe((event: IEvent) => this._onReceivedEvent(event));\r\n }\r\n\r\n @HostListener('click')\r\n public close(): void {\r\n // broadcast to itself and all others subscriber including the components\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE, data: null });\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n const fadeDuration = this.options.fadeDuration;\r\n\r\n this._rendererRef.setStyle(this._elemRef.nativeElement,\r\n '-webkit-animation-duration', `${fadeDuration}s`);\r\n this._rendererRef.setStyle(this._elemRef.nativeElement,\r\n 'animation-duration', `${fadeDuration}s`);\r\n this._sizeOverlay();\r\n }\r\n\r\n @HostListener('window:resize')\r\n public onResize(): void {\r\n this._sizeOverlay();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subscription.unsubscribe();\r\n }\r\n\r\n private _sizeOverlay(): void {\r\n const width = this._getOverlayWidth();\r\n const height = this._getOverlayHeight();\r\n\r\n this._rendererRef.setStyle(this._elemRef.nativeElement, 'width', `${width}px`);\r\n this._rendererRef.setStyle(this._elemRef.nativeElement, 'height', `${height}px`);\r\n }\r\n\r\n private _onReceivedEvent(event: IEvent): void {\r\n switch (event.id) {\r\n case LIGHTBOX_EVENT.CLOSE:\r\n this._end();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n private _end(): void {\r\n this.classList = 'lightboxOverlay animation fadeOutOverlay';\r\n\r\n // queue self destruction after the animation has finished\r\n // FIXME: not sure if there is any way better than this\r\n setTimeout(() => {\r\n this.cmpRef.destroy();\r\n }, this.options.fadeDuration * 1000);\r\n }\r\n\r\n private _getOverlayWidth(): number {\r\n return Math.max(\r\n this._documentRef.body.scrollWidth,\r\n this._documentRef.body.offsetWidth,\r\n this._documentRef.documentElement.clientWidth,\r\n this._documentRef.documentElement.scrollWidth,\r\n this._documentRef.documentElement.offsetWidth\r\n );\r\n }\r\n\r\n private _getOverlayHeight(): number {\r\n return Math.max(\r\n this._documentRef.body.scrollHeight,\r\n this._documentRef.body.offsetHeight,\r\n this._documentRef.documentElement.clientHeight,\r\n this._documentRef.documentElement.scrollHeight,\r\n this._documentRef.documentElement.offsetHeight\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LightboxConfig {\r\n public fadeDuration: number;\r\n public resizeDuration: number;\r\n public fitImageInViewPort: boolean;\r\n public positionFromTop: number;\r\n public showImageNumberLabel: boolean;\r\n public alwaysShowNavOnTouchDevices: boolean;\r\n public wrapAround: boolean;\r\n public disableKeyboardNav: boolean;\r\n public disableScrolling: boolean;\r\n public centerVertically: boolean;\r\n public enableTransition: boolean;\r\n public albumLabel: string;\r\n public showZoom: boolean;\r\n public showRotate: boolean;\r\n public containerElementResolver: (document: any) => HTMLElement;\r\n\r\n constructor() {\r\n this.fadeDuration = 0.7;\r\n this.resizeDuration = 0.5;\r\n this.fitImageInViewPort = true;\r\n this.positionFromTop = 20;\r\n this.showImageNumberLabel = false;\r\n this.alwaysShowNavOnTouchDevices = false;\r\n this.wrapAround = false;\r\n this.disableKeyboardNav = false;\r\n this.disableScrolling = false;\r\n this.centerVertically = false;\r\n this.enableTransition = true;\r\n this.albumLabel = 'Image %1 of %2';\r\n this.showZoom = false;\r\n this.showRotate = false;\r\n this.containerElementResolver = (documentRef) => documentRef.querySelector('body');\r\n }\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentFactoryResolver,\r\n ComponentRef,\r\n Inject,\r\n Injectable,\r\n Injector\r\n} from '@angular/core';\r\nimport { LightboxComponent } from './lightbox.component';\r\nimport { LightboxConfig } from './lightbox-config.service';\r\nimport { LightboxEvent, LIGHTBOX_EVENT, IAlbum } from './lightbox-event.service';\r\nimport { LightboxOverlayComponent } from './lightbox-overlay.component';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class Lightbox {\r\n constructor(\r\n private _componentFactoryResolver: ComponentFactoryResolver,\r\n private _injector: Injector,\r\n private _applicationRef: ApplicationRef,\r\n private _lightboxConfig: LightboxConfig,\r\n private _lightboxEvent: LightboxEvent,\r\n @Inject(DOCUMENT) private _documentRef\r\n ) { }\r\n\r\n open(album: Array, curIndex = 0, options = {}): void {\r\n const overlayComponentRef = this._createComponent(LightboxOverlayComponent);\r\n const componentRef = this._createComponent(LightboxComponent);\r\n const newOptions: Partial = {};\r\n\r\n // broadcast open event\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.OPEN });\r\n Object.assign(newOptions, this._lightboxConfig, options);\r\n\r\n // attach input to lightbox\r\n componentRef.instance.album = album;\r\n componentRef.instance.currentImageIndex = curIndex;\r\n componentRef.instance.options = newOptions;\r\n componentRef.instance.cmpRef = componentRef;\r\n\r\n // attach input to overlay\r\n overlayComponentRef.instance.options = newOptions;\r\n overlayComponentRef.instance.cmpRef = overlayComponentRef;\r\n\r\n // FIXME: not sure why last event is broadcasted (which is CLOSED) and make\r\n // lightbox can not be opened the second time.\r\n // Need to timeout so that the OPEN event is set before component is initialized\r\n setTimeout(() => {\r\n this._applicationRef.attachView(overlayComponentRef.hostView);\r\n this._applicationRef.attachView(componentRef.hostView);\r\n overlayComponentRef.onDestroy(() => {\r\n this._applicationRef.detachView(overlayComponentRef.hostView);\r\n });\r\n componentRef.onDestroy(() => {\r\n this._applicationRef.detachView(componentRef.hostView);\r\n });\r\n\r\n const containerElement = newOptions.containerElementResolver(this._documentRef);\r\n containerElement.appendChild(overlayComponentRef.location.nativeElement);\r\n containerElement.appendChild(componentRef.location.nativeElement);\r\n });\r\n }\r\n\r\n close(): void {\r\n if (this._lightboxEvent) {\r\n this._lightboxEvent.broadcastLightboxEvent({ id: LIGHTBOX_EVENT.CLOSE });\r\n }\r\n }\r\n\r\n _createComponent(ComponentClass: any): ComponentRef {\r\n const factory = this._componentFactoryResolver.resolveComponentFactory(ComponentClass);\r\n const component = factory.create(this._injector);\r\n\r\n return component;\r\n }\r\n}\r\n","import { Lightbox } from './lightbox.service';\r\nimport {LightboxComponent, SafePipe} from './lightbox.component';\r\nimport { LightboxConfig } from './lightbox-config.service';\r\nimport { LightboxEvent, LightboxWindowRef } from './lightbox-event.service';\r\nimport { LightboxOverlayComponent } from './lightbox-overlay.component';\r\nimport { NgModule } from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n declarations: [LightboxOverlayComponent, LightboxComponent, SafePipe],\r\n providers: [\r\n Lightbox,\r\n LightboxConfig,\r\n LightboxEvent,\r\n LightboxWindowRef\r\n ]\r\n})\r\nexport class LightboxModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/lightbox-config.service.d.ts b/lib/lightbox-config.service.d.ts new file mode 100644 index 0000000..1361545 --- /dev/null +++ b/lib/lightbox-config.service.d.ts @@ -0,0 +1,21 @@ +import * as i0 from "@angular/core"; +export declare class LightboxConfig { + fadeDuration: number; + resizeDuration: number; + fitImageInViewPort: boolean; + positionFromTop: number; + showImageNumberLabel: boolean; + alwaysShowNavOnTouchDevices: boolean; + wrapAround: boolean; + disableKeyboardNav: boolean; + disableScrolling: boolean; + centerVertically: boolean; + enableTransition: boolean; + albumLabel: string; + showZoom: boolean; + showRotate: boolean; + containerElementResolver: (document: any) => HTMLElement; + constructor(); + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵprov: i0.ɵɵInjectableDeclaration; +} diff --git a/lib/lightbox-event.service.d.ts b/lib/lightbox-event.service.d.ts new file mode 100644 index 0000000..4dcf2c0 --- /dev/null +++ b/lib/lightbox-event.service.d.ts @@ -0,0 +1,35 @@ +import { Observable } from 'rxjs'; +import * as i0 from "@angular/core"; +export interface IEvent { + id: number; + data?: any; +} +export interface IAlbum { + src: string; + caption?: string; + thumb: string; + iframe?: boolean; +} +export declare const LIGHTBOX_EVENT: { + CHANGE_PAGE: number; + CLOSE: number; + OPEN: number; + ZOOM_IN: number; + ZOOM_OUT: number; + ROTATE_LEFT: number; + ROTATE_RIGHT: number; + FILE_NOT_FOUND: number; +}; +export declare class LightboxEvent { + private _lightboxEventSource; + lightboxEvent$: Observable; + constructor(); + broadcastLightboxEvent(event: any): void; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵprov: i0.ɵɵInjectableDeclaration; +} +export declare class LightboxWindowRef { + get nativeWindow(): any; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵprov: i0.ɵɵInjectableDeclaration; +} diff --git a/lib/lightbox-overlay.component.d.ts b/lib/lightbox-overlay.component.d.ts new file mode 100644 index 0000000..048e6b4 --- /dev/null +++ b/lib/lightbox-overlay.component.d.ts @@ -0,0 +1,25 @@ +import { AfterViewInit, ElementRef, OnDestroy, Renderer2 } from '@angular/core'; +import { LightboxEvent } from './lightbox-event.service'; +import * as i0 from "@angular/core"; +export declare class LightboxOverlayComponent implements AfterViewInit, OnDestroy { + private _elemRef; + private _rendererRef; + private _lightboxEvent; + private _documentRef; + options: any; + cmpRef: any; + classList: any; + private _subscription; + constructor(_elemRef: ElementRef, _rendererRef: Renderer2, _lightboxEvent: LightboxEvent, _documentRef: any); + close(): void; + ngAfterViewInit(): void; + onResize(): void; + ngOnDestroy(): void; + private _sizeOverlay; + private _onReceivedEvent; + private _end; + private _getOverlayWidth; + private _getOverlayHeight; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} diff --git a/lib/lightbox.component.d.ts b/lib/lightbox.component.d.ts new file mode 100644 index 0000000..37b943b --- /dev/null +++ b/lib/lightbox.component.d.ts @@ -0,0 +1,84 @@ +import { AfterViewInit, ElementRef, OnDestroy, OnInit, PipeTransform, Renderer2 } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { IAlbum, LightboxEvent, LightboxWindowRef } from './lightbox-event.service'; +import * as i0 from "@angular/core"; +export declare class SafePipe implements PipeTransform { + private sanitizer; + constructor(sanitizer: DomSanitizer); + transform(url: any): import("@angular/platform-browser").SafeResourceUrl; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵpipe: i0.ɵɵPipeDeclaration; +} +export declare class LightboxComponent implements OnInit, AfterViewInit, OnDestroy, OnInit { + private _elemRef; + private _rendererRef; + private _lightboxEvent; + _lightboxElem: ElementRef; + private _lightboxWindowRef; + private _sanitizer; + private _documentRef; + album: Array; + currentImageIndex: number; + options: any; + cmpRef: any; + _outerContainerElem: ElementRef; + _containerElem: ElementRef; + _leftArrowElem: ElementRef; + _rightArrowElem: ElementRef; + _navArrowElem: ElementRef; + _dataContainerElem: ElementRef; + _imageElem: ElementRef; + _iframeElem: ElementRef; + _captionElem: ElementRef; + _numberElem: ElementRef; + content: any; + ui: any; + private _cssValue; + private _event; + private _windowRef; + private rotate; + constructor(_elemRef: ElementRef, _rendererRef: Renderer2, _lightboxEvent: LightboxEvent, _lightboxElem: ElementRef, _lightboxWindowRef: LightboxWindowRef, _sanitizer: DomSanitizer, _documentRef: any); + ngOnInit(): void; + ngAfterViewInit(): void; + ngOnDestroy(): void; + close($event: any): void; + control($event: any): void; + private _rotateContainer; + private _resetImage; + private _calcTransformPoint; + nextImage(): void; + prevImage(): void; + private _validateInputData; + private _registerImageLoadingEvent; + /** + * Fire when the image is loaded + */ + private _onLoadImageSuccess; + private _centerVertically; + private _sizeContainer; + private _postResize; + private _showImage; + private _prepareComponent; + private _positionLightBox; + /** + * addCssAnimation add css3 classes for animate lightbox + */ + private _addCssAnimation; + private _end; + private _updateDetails; + private _albumLabel; + private _changeImage; + private _hideImage; + private _updateNav; + private _showLeftArrowNav; + private _showRightArrowNav; + private _showArrowNav; + private _enableKeyboardNav; + private _disableKeyboardNav; + private _keyboardAction; + private _getCssStyleValue; + private _onReceivedEvent; + needsIframe(src: string): boolean; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} diff --git a/lib/lightbox.module.d.ts b/lib/lightbox.module.d.ts new file mode 100644 index 0000000..8af77b2 --- /dev/null +++ b/lib/lightbox.module.d.ts @@ -0,0 +1,9 @@ +import * as i0 from "@angular/core"; +import * as i1 from "./lightbox-overlay.component"; +import * as i2 from "./lightbox.component"; +import * as i3 from "@angular/common"; +export declare class LightboxModule { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵinj: i0.ɵɵInjectorDeclaration; +} diff --git a/lib/lightbox.service.d.ts b/lib/lightbox.service.d.ts new file mode 100644 index 0000000..15e386b --- /dev/null +++ b/lib/lightbox.service.d.ts @@ -0,0 +1,18 @@ +import { ApplicationRef, ComponentFactoryResolver, ComponentRef, Injector } from '@angular/core'; +import { LightboxConfig } from './lightbox-config.service'; +import { LightboxEvent, IAlbum } from './lightbox-event.service'; +import * as i0 from "@angular/core"; +export declare class Lightbox { + private _componentFactoryResolver; + private _injector; + private _applicationRef; + private _lightboxConfig; + private _lightboxEvent; + private _documentRef; + constructor(_componentFactoryResolver: ComponentFactoryResolver, _injector: Injector, _applicationRef: ApplicationRef, _lightboxConfig: LightboxConfig, _lightboxEvent: LightboxEvent, _documentRef: any); + open(album: Array, curIndex?: number, options?: {}): void; + close(): void; + _createComponent(ComponentClass: any): ComponentRef; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵprov: i0.ɵɵInjectableDeclaration; +} diff --git a/lightbox.scss b/lightbox.scss new file mode 100644 index 0000000..ce5c1b3 --- /dev/null +++ b/lightbox.scss @@ -0,0 +1,401 @@ +html.lb-disable-scrolling { + overflow: hidden; +} + +.lightboxOverlay { + position: absolute; + top: 0; + left: 0; + z-index: 9999; + background-color: black; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + opacity: 0.8; +} + +.lightbox { + position: absolute; + left: 0; + width: 100%; + z-index: 10000; + text-align: center; + line-height: 0; + font-weight: normal; + box-sizing: content-box; + outline: none; +} + +.lightbox .lb-image { + height: auto; + max-width: inherit; + max-height: none; + border-radius: 3px; +} + +.lightbox .lb-iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.lightbox a img { + border: none; +} + +.lb-outerContainer { + position: relative; + *zoom: 1; + width: 250px; + height: 250px; + margin: 0 auto; + border-radius: 4px; + + /* Background color behind image. + This is visible during transitions. */ + background-color: white; +} + +.lb-outerContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-loader { + position: absolute; + top: 43%; + left: 0; + height: 25%; + width: 100%; + text-align: center; + line-height: 0; +} + +.lb-cancel { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + background: url('data:image/gif;base64,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') no-repeat; +} + +.lb-nav { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 10; +} + +.lb-iframe ~ .lb-nav { + position: absolute; + top: 50%; + left: 0; + height: 45px; + width: 100%; + z-index: 10; + transform: translateY(-50%); +} + +.lb-container > .nav { + left: 0; +} + +.lb-nav a { + outline: none; + background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); +} + +.lb-prev, .lb-next { + height: 100%; + cursor: pointer; + display: block; +} + +.lb-nav a.lb-prev { + width: 34%; + left: 0; + float: left; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAtCAYAAADsvzj/AAAFF0lEQVR4Ac2ZW0xcVRSGPTNnhlPKcCsUAeeChkEVxhutDQwzMANaqamNWgpaH+yDIaZp1cRHbgH0gTsxkmDCI/hiRAqgD5qYRgKQ8II6TE00wfgGAcIdKeM/ydrNZIezxxg9m518gRxWmn6s9a9zhvNQJBL5T/gfjokwA5Uw0zWFeHBOugiTsAArfSWZky+iABVowAZSwRkiDSTRz1iHlJMmogATsIDTIAPYgRs8SeTTtXSQSLVKFNkivIQKksDDJFCsquqLmqZdAa/i+yCuPQ1cJHOKjdpJEWGdsIFs8BQoy83NvTEzMzO3t7f318HBweHc3Nxdj8dznWQeIWmpIryENUaiCPgdDsfN+fn5XyLcWV5eDlmt1gBqHgOpbAHIFmESySAHeECF0+m8hd/+vcgxZ3d39wBj9grqCkA6iaiyRBRunJhEpcvl+nBhYeG3iM7Z2dnZgkg1ZSgNqLI6wgebSVTZ7faPlpaW/tSTWF9f36ivr+9AbQkF3iZRhAs2dSInJ+eDUCj0h0Biq7S09BPUBkEhyAKJssKusE6QRCGoQLDfn56eDulJrK6ubgeDwS7UXgTPAztIkXUfUbhxKgLlyMRtBPtXPYm1tbXdqqoqJnEOOGhbJQCTkSJ8sJlEMNoJrFhdicPDw6PKyspe1FaD85yE2YBnLUGwSSIrK+s2bnZLehIbGxubfr+/B7WXSMJJ42QlCcVAES7YJJGdnR0dp7BgnLZKSko6qBPngIvrBEkYIKIT7PLoOKET4TjB7kbty+A8SaRxmcAxQEQn2BUI9q3Z2dl7gk7sINhRiZeoE87jMmGECB/s3JhgR8dJV2Jzc3Pb5/N1UieKKdgsEyaAY5wIk2Dj5GHBRifCgmBHb3adLBNsO3HBNkxEAWZwCmSCx4EPwb4ZJ9jbCHYXSRQDpyDYhomoNFIOUIRMvINO/KQnsbKyshMIBD5D7RVwgQWblzBahD2Sp5jN5jzM+9uLi4s/60mEw+FNbKcvUH8DVIECcAZoXLCliaRaLBbX8PBwb0RwRkZGfkftx+BdUM4+KInDbdxoWUCKoih5CQkJgYGBgS/xs6PjRPb394+ampp+RP174CIoBGcpYypQZIqYY+4dz4DLvb29Y6LONDY2fou6OuAF+SCDZCgj8kQSQDqNihfU9vX1TYlkGhoa7qDuDVBKMpQVrjMG30fYCs6gAHuRmdqurq5JkUxLS8sEaq+CMq4zJGOgCB2Fk8kHJSaTqaazs3Pi2MzQaWtrm0RtDfDFyCQyGUNFOJlEkMlkwLWenp5vRDKtra1TNGYsM5mcjKEifGeYjBfUQUaYmebm5omYzLjFC8C4zyNqTGfcNDZ1/2ABjKHudZLXkTFARJAZN/CqqnqNMqN7Ojo6vqMF4ONkVFmvFUQLQNiZ7u7u76PZAn6S4TJjrIhoAdT+iwXAdQYYKCJaAG/iPhNvAYyj7jXwAngUpAGrDBF+ATCZAuBXFOX60NDQ3TiPM1/hyfoyPf7kgNNSXyvwmSGZMk3T3hocHPwhzlPzJLLFnpZT5PztV5wZNyilbTZFmTnZrxU4GZWXATV4ap4kmeNELlEticjsSHyZq/39/V/j374P2Lk/Pj5+BznxUuDlj1acJ4B8cAH/4er29vbPR0dH58fGxubx/ac2my1Ab3iz5Yc9/gJIB05QCJ4Fz9FXD3gC5HIfi+WKCGQ0GpuzwA7yCDtdS+b/SCFfRPwaQqPxSSaS6JrlwUjR+RtEvCM0ct4sLQAAAABJRU5ErkJggg==') left 48% no-repeat; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + -o-transition: opacity 0.6s; + transition: opacity 0.6s; +} + +.lb-iframe ~ .lb-nav a.lb-prev { + width: 55px; +} + +.lb-nav a.lb-prev:hover { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +.lb-nav a.lb-next { + width: 64%; + right: 0; + float: right; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAtCAYAAADsvzj/AAAFDUlEQVR4Ac2ZS0xcVRjHvTN3hisw0GIRZ3AeLWHQWqdVsRqgA86AUmpqoy20Whd2YYhprJq45BVAF7yJkQQTluDGiEhBF5qYRsIjYYMKQxNNMO4gQHgjZfxP8pF8ufEe0qQ5pyf5BTKcWfzyff/vnHt5xLQ0wgbsQCfswEY80BWPxx8I5sUlHMBJP0nm4RfRWAUMkAqOgseII8AFDNqjPYwiGuEAySADeEEuOEkE6bNjIIX22riQchHWSo+SRACc1nU9ahjGG+ASfn8Vn+WT0BNUMV0so04kFTwJTodCoeuTk5N3dnd397a3t/8dHx+fzM7OvoG/nQPPADdwscqoF2HBPgJynE5nZGFhYTZuWlNTU3/4fL6b2FMMnmUyTpJRLqKTSAbIQyu9vrW1tRv/n4Uqzfv9/g+x7xUQAh6QxmVUV0SnKRWESMXm5uZ63GJNT0//GQgEPsHeUibD20xTLeKioBdUV1e3rKysrFrJzM3N/eP1ej/F3jImIxgAcsOeDLLAKRAtLCz8HDKWlZmdnf3b4/F8zCojGADyz5F04AUvgPJoNNq2tLS0YSUzNjY2iwHwEWXmFHCzymiqRGwgiaaXD7wIysvKytqWl5e3rGQwAO4iM7ewt4SmmYfLqLpr2U0yZ0FFaWlp597e3r6VDEbzXapMlGQEA0COiEYyTmozP8lcKC4u7lhdXV2zksGhOZeVlXWLy5gHgDwRJsMqE6A2qygoKGhBm60L2izmdruZjGkAyBShxTNzlGTOgvMYAO2iAYDKxKjNSgQDQI6IRWb8VJnXMADaUZlNK5mJiYl5DAC6AQgGgCwRWjaWGR/IB+fD4XDr2trahqDN5lEZ3mbZ5gEgW4QPAD6aK3BotmIArAsqE2MDIMTajGTkinAZ3mb5NAAS58zGIQPgJvaGwVMgk5597ECTLcJl+AB4GVyKRCJfLi4uijLzGzLzHrWYj1pMVyXCB4BBz/J5oAzcwDT7OhaLWZ4zMzMzvyNX79rt9uOUNyewqRSxsbzk0Jh9H3w2MDDwV1yw+vv7Ox0OR4C+q1REAzr1+ON0TpSDD+rq6n7d2dmxusbs9/T0fJOUlBTRNO2gIg6lGSGJYyAXFIFrtbW1P4oq0dnZOYR9F8EZdqaoCDtVgrJBEoXgck1Nzfciia6urlHsu0rSOSADJEkXYRK8EufAlYaGhtsiiba2thFk4kAij75Po1fiOcIkkplEGFQ2NTWNCBz2W1tbb9tstkrsLaDvcQlN5hWFS2SyTFxubGwcFUl0dHT8gH1VTCITJHMJWSLmYAcPMlFfXy9sJ0gkMnGNpEnCXAkJIhYSReAtBHvosGCTRBgEWSV0qc8jPNhMIgyutLS0/CSSSGRC1/Uqkg5aZUKGiDkTQVAMqtrb238+RGJUHGyZb1F4Je4/2FfFwZYr4qRb7QnwEngTwR4+5JxIZOJtcbDlv2lMAR5wBjfUi7h2fCuS6Ovru6Np2nVqvzwmQcFW9+43HeSg10twix0RSfT29v5iGMY7dMLniTOh+N8KghN7lKZTIQgKMiG/IkwkCJELFiL7uMWOYE+lWUL8elRNa51APoqGh4cTN9p7TOJed3f3d4nz5P4l1ITdDU66XK5Ic3PzF0NDQ1ODg4NT+P0rCFbQM3qu4MRWLsIfX7PB0yAEngPP089TwA8yBMFWKmJ+qZBGj7FecJzw0mfpwBBLqBexseAbIBWkESnAEPybQLnIf4JfIzSb+FymAAAAAElFTkSuQmCC') right 48% no-repeat; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + -o-transition: opacity 0.6s; + transition: opacity 0.6s; +} + +.lb-iframe ~ .lb-nav a.lb-next { + width: 55px; +} + +.lb-nav a.lb-next:hover { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +.lb-dataContainer { + margin: 0 auto; + padding-top: 10px; + *zoom: 1; + width: 100%; + -moz-border-radius-bottomleft: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.lb-dataContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-data { + padding: 0 4px; + color: #ccc; +} + +.lb-data .lb-details { + max-width: 80%; + float: left; + text-align: left; + line-height: 1.1em; +} + +.lb-data .lb-caption { + font-size: 13px; + font-weight: bold; + line-height: 1em; +} + +.lb-data .lb-caption a { + color: #4ae; +} + +.lb-data .lb-number { + display: block; + clear: left; + padding-bottom: 1em; + font-size: 12px; + color: #999999; +} + +.lb-data .lb-controlContainer { + float: right; +} + +.lb-data .lb-turnContainer { + float: left; + margin-right: 5px; +} + +.lb-data .lb-zoomContainer { + float: right; + margin-right: 5px; +} + +.lb-data .lb-closeContainer { + float: right; +} + +.lb-data .lb-close { + display: block; + float: right; + width: 30px; + height: 30px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAAPFBMVEX///8AAAD9/f2CgoKAgIAAAAAAAAAAAABLS0sAAAAAAACqqqqqqqq6urpKSkpISEgAAAC7u7u5ubn////zbsMcAAAAE3RSTlMASv6rqwAWS5YMC7/AyZWVFcrJCYaKfAAAAHhJREFUeF590kkOgCAQRFEaFVGc+/53FYmbz6JqBbyQMFSYuoQuV+iTflnstI7ssLXRvMWRaEMs84e2uVckuZe6knL0hiSPObXhj6ChzoEkIolIIpKIO4joICAIeDd7QGIfCCjOKe9HEk8mnxpIAup/F31RPZP9fAG3IAyBSJe0igAAAABJRU5ErkJggg==') top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.lb-data .lb-turnLeft { + display: block; + float: left; + width: 30px; + height: 30px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAACIElEQVRIicWWPWsUURSG3xM/4hYpjLIhphJiIYugNloIiRoU/QO20UJrU1gE/EAbRReCGkQQEbFLCi0EG5NKEIKYItFSkBhSmMLIipolj8WeWa/rbrIzmdm8MNy599xznjN37pe0QbKwAlyTdFjSoJkt1Nhyko5L6pe0S1KPmxYkzUmalDRpZqXYWQDLVHQuaNsNPAFKrK2fwCOgNy440nlgK1AEftUE/wJMAM/8mQDma/qUgVvAlrjgK8CboF4C7gAHAKvjZ24r1ozMFNAdB7wSvI8BXTFGLe8+kT4A+WbBkd4DF4Czazr/H2so+ICpVYe9DjjUyzhgj3cp8L+RBPwbGI4L9pjjHmMZ2JMkRiIB3cA3hz9oGdjhdx38A+hoJXhf8NtOS1Jbi9gzkhb9/WgVTGUD6GnktV6ZGZLeebVQBUsalTQHDGYFlzTvZWcIPuhlX4bgz14uSdJmr0xLOqTKEZeVRiR9lfS82gJ0AAPApgzBGyMaHTTAKeBTFhMMuOxr+Go944gbl4DOFKFdwPeGWyZQ8MNgBSikCL7v0DKwN2qPZrXMbBY4ImmHmc2mBZbU7mXRzD42k+kx4OR6qUCOBlemep138vf2MAZsjwHKA/eA60mybAfeBifKzSb9hn1y4ok3fVcLg2wDbgMzwAlva/PJ8gp4CvQH/fcHiZZZ7aqTIJle/tV0YMsBD4HHaa6KEH4ReAG8Bs6kDshafwDkXu6L86KiLgAAAABJRU5ErkJggg==') top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.lb-data .lb-turnRight { + display: block; + float: right; + width: 30px; + height: 30px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAACGUlEQVRIicWXPWgUQRTH/3OJiSCEgJg7FcEmGLkmNoKCYESLYGNrqaDBSkQri4ARDPgBQRBU8CNgE8TCwkIhIqiVYLAQg5UoOZA0Eg1RE/xZ7DsymZzu7HJ7GVgG5r3/+82+3Z33Vlqj4WIdgQ2SBuzaJqlsphlJNUkvJE065xYC3WZJ9yW9ds6NRO8M6AXuAD9JHz+Ae8B2T3/cbIuxwA7gMrAUBJ8BJoEHdj0HaoHPL+CKxThZX4yBbgHeBHdyFegHVj0ewAG7gGvAvKd7BQxHgYEy8METTwA9UWlK9BXgkaf/kwq21Lz1BGdigabvAY4BQ8BUkP7/gi95fueyQE3/JISlgoEdLL9IE1mhFuM88Dsr+LbZvwGVPOA8O+0CFgw81hKogQ97Gam2glmyeb/Ns865960E1+9yqkgYsDUEb7S5ViD0hKQvwHUf/NXm2aLAkvYqqYa7JandFk9LeiZpvEDwZ5s/FshYPew4Pgh0hoa2lh0cAfiifcdnC4h9CvgEDDYy1o/M70C5gT4vtBuYs9ijjRx2ekXiVhPBfSQldvGfpyLLZfFus8AWdxDYk+ZUBTqaADsCHMgjLAEjJE1bltanC3homVsCNmUFV7yKNQdcANoidH4X8xIopWkaBRllZXvb79n2AePAU+Am0G7rh4Bpy9T6zFAPULVP7Qawzlt/x8rRmxuScUNHSZr5xyRdZfTv0JqOvwtaARgflgIWAAAAAElFTkSuQmCC') top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.lb-data .lb-zoomOut { + display: block; + float: left; + width: 30px; + height: 30px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAB7UlEQVRIieXWvWsUURTG4XPjJpgmlSFKRAtTWGjAj0ajiSKKFopg/AtELbQTAiI2IaazEhsLK0XEVisbISD4gY2FlQQixiAYxESiBn0sdoKTQHZ3dte18FR3uO97fufcmbmciH8UqVYhUkT0RER3RMxGxMeU0uJfqQoJJ/EAc5bHDzzGWXQ0E9qPZ/iMGziCXnRgPfZgDFN4i2PNgJ7IOryFdVW0a3EZ3zHSCHQfvuFCQd8hzONcPdAuzGC0sLnsP5UVvb2o8RpeY0094CzHXTwqYmjHLIbrhWZ5tuAX+mo1LL2jzkbAWa4XuFRJ05Zb74iIlymlhUbBETERETsrCUq59YaImM5vYlNEXKkBdCelNJF7fh/lRlaNtkqbDUbF6zjf8YeI2LXMmdJURJyvA9obETOVBPmOX0XE7mZ8XBExGBHPa1KihE843QgRffiJrUVMo3iDUnX1qjnu4WFRUxemMVYndBgLha/MzLw3M18s6DucXUDXC0NzSY7jC26ju4q2E1exmA0I8xhqBL4NT7MCbuIoNuYGgQGM4x0mMZJBmwJP2VBwPysgHwt4gjNLvyCGVsAH64avKKRHeSTabJU5awV8rmnwGgscyJ3QVxz8b+EHWgnf789MPon2VsIHlGfv/pZBc/DWdVopfgMdyEl3/DM14wAAAABJRU5ErkJggg==') top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.lb-data .lb-zoomIn { + display: block; + float: right; + width: 30px; + height: 30px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAB+UlEQVRIieXWv29NcRzG8c+XttGlk6aEMOhAQhM/FkpLhDD4kai/QFgYpQliaRobi1gMJoRYmSxNmkhIWVibJkQjQiNaKRpehh7p0bTnntt7XYNnOiff5znv53vvPd/7ifhHSmWNSBHRERHtETEREe9TSjN/pRUSjuMBJv2p73iM02ipJ7QLT/EJ13EQa9CCVdiJQbzGKA7XA3o02+FNrKzgXYEL+Ib+WqC78RVnq8ztxxTOLAXahncYqDo8mz+Rld5SbXAQL7G8wDOCTQXrd/CoGmgzJtBXwQfbC9Y34Cc6i56zLHfdExEtEVG+7QJKKY1GxPOIOFYWvDUiRlJK07WAMw1HxLYiQ1PuenVEjOcXsS4iLi2Qu4gPufvbKaXh3P3bmN3IolpWtFijyh3HOI+hEr7CH1fmuYZ7RZ78jl9ExA60lmparJ6IeFbKiSZ8xMkKvkqvUyd+YGPpmhjAqxoPkLt4WBqahdowjsGqgnP5PkxXfWRm4V1Z+FyVuQPZn8TVqqG5hxzBZ9xCewVvKy5jJvv+p9BbC3wznmQFbuAQ1uYGgW5cwRuMoT+D1gWesqHgflYgr2kM4dTvVxC98+A9S4bPK9JhdiRab5E5ax58sm7wkgW7c5/QF+z7b+F7GwnfY24mH0NzI+HdZmfvroZBc/DG7bRIvwDiiW2v3ei28wAAAABJRU5ErkJggg==') top right no-repeat; + text-align: right; + outline: none; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70); + opacity: 0.7; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.lb-data .lb-close:hover { + cursor: pointer; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +/* animation */ +@keyframes fadeIn{ + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-webkit-keyframes fadeIn{ + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeOut{ + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-webkit-keyframes fadeOut{ + 0% {opacity: 1;} + 100% {opacity: 0;} +} + + +@keyframes fadeInOverlay{ + 0% {opacity: 0;} + 100% {opacity: 0.8;} +} + +@-webkit-keyframes fadeInOverlay{ + 0% {opacity: 0;} + 100% {opacity: 0.8;} +} + +@keyframes fadeOutOverlay{ + 0% {opacity: 0.8;} + 100% {opacity: 0;} +} + +@-webkit-keyframes fadeOutOverlay{ + 0% {opacity: 0.8;} + 100% {opacity: 0;} +} + +.fadeIn{ + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +.fadeInOverlay{ + -webkit-animation-name: fadeInOverlay; + animation-name: fadeInOverlay; +} + +.fadeOut{ + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +.fadeOutOverlay{ + -webkit-animation-name: fadeOutOverlay; + animation-name: fadeOutOverlay; +} + +.animation{ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.transition{ + /* For Safari 3.1 to 6.0 */ + -webkit-transition-property: all; + -webkit-transition-timing-function: ease; + /* Standard syntax */ + transition-property: all; + transition-timing-function: ease; +} + +.lb-image { + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + transition-property: transform; + } + +/* animation */ diff --git a/ngx-lightbox.d.ts b/ngx-lightbox.d.ts new file mode 100644 index 0000000..db827f8 --- /dev/null +++ b/ngx-lightbox.d.ts @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +/// +export * from './public-api'; diff --git a/package.json b/package.json new file mode 100644 index 0000000..819c208 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "ngx-lightbox", + "version": "13.0.0", + "peerDependencies": { + "@angular/common": "^13.3.11", + "@angular/core": "^13.3.11" + }, + "dependencies": { + "tslib": "^2.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/viscoci/ngx-lightbox.git", + "directory": "dist/ngx-lightbox" + }, + "module": "fesm2015/ngx-lightbox.mjs", + "es2020": "fesm2020/ngx-lightbox.mjs", + "esm2020": "esm2020/ngx-lightbox.mjs", + "fesm2020": "fesm2020/ngx-lightbox.mjs", + "fesm2015": "fesm2015/ngx-lightbox.mjs", + "typings": "ngx-lightbox.d.ts", + "exports": { + "./package.json": { + "default": "./package.json" + }, + ".": { + "types": "./ngx-lightbox.d.ts", + "esm2020": "./esm2020/ngx-lightbox.mjs", + "es2020": "./fesm2020/ngx-lightbox.mjs", + "es2015": "./fesm2015/ngx-lightbox.mjs", + "node": "./fesm2015/ngx-lightbox.mjs", + "default": "./fesm2020/ngx-lightbox.mjs" + } + }, + "sideEffects": false +} \ No newline at end of file diff --git a/public-api.d.ts b/public-api.d.ts new file mode 100644 index 0000000..4e004bb --- /dev/null +++ b/public-api.d.ts @@ -0,0 +1,4 @@ +export * from './lib/lightbox.service'; +export * from './lib/lightbox-config.service'; +export * from './lib/lightbox-event.service'; +export * from './lib/lightbox.module';