New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

alphabetical-scroll-bar

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

alphabetical-scroll-bar - npm Package Compare versions

Comparing version 2.0.0 to 2.0.1

2

bundles/alphabetical-scroll-bar.umd.js

@@ -145,3 +145,2 @@ (function (global, factory) {

var newLetterIndex = this.getLetterIndexFromCoordinates(x, y);
this.letterIndex = Math.round(newLetterIndex * (this.visibleLetters.length / this.alphabet.length));
if (!this.navigateOnHover)

@@ -180,2 +179,3 @@ return;

}
this.letterIndex = Math.round(letterIndex * (this.visibleLetters.length / this.alphabet.length));
return letterIndex;

@@ -182,0 +182,0 @@ };

@@ -1,2 +0,2 @@

!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/core"),require("@angular/common")):"function"==typeof define&&define.amd?define("alphabetical-scroll-bar",["exports","@angular/core","@angular/common"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["alphabetical-scroll-bar"]={},t.ng.core,t.ng.common)}(this,(function(t,e,n){"use strict";var i=function(){};i.ɵprov=e.ɵɵdefineInjectable({factory:function(){return new i},token:i,providedIn:"root"}),i.decorators=[{type:e.Injectable,args:[{providedIn:"root"}]}],i.ctorParameters=function(){return[]};var o=function(){function t(){this.letterMagnification=!1,this.exactX=!1,this.alphabet="abcdefghijklmnopqrstuvwxyz".toUpperCase().split(""),this.validLetters=void 0,this.navigateOnHover=!1,this.letterChange=new e.EventEmitter,this.endTouch=new e.EventEmitter,this.visibleLetters=[],this.active=!1,this.hidden=0}return t.prototype.ngOnInit=function(){var t=this,e=setInterval((function(){t.alphabetContainer.nativeElement.clientHeight>0&&(t.onResize(),window.addEventListener("resize",t.onResize.bind(t)),clearInterval(e))}),100)},t.prototype.ngOnDestroy=function(){window.removeEventListener("resize",this.onResize.bind(this))},t.prototype.onResize=function(){var t=this.alphabet,e=Number(window.getComputedStyle(document.body).getPropertyValue("font-size").match(/\d+/)[0]),n=this.alphabetContainer.nativeElement.clientHeight,i=Math.ceil(this.letterIndex*n/e);this.letterIndex=i,this.onLetterIndexChange(i);var o=this.alphabet.length;if(n/e<o){for(var r=o-Math.floor(n/e),a=this.getNumHiddenHalves(r,o)+1,s=this.alphabet.slice(0,Math.ceil(o/2)),l=this.alphabet.slice(Math.floor(o/2)).reverse(),c=0;c<a;c++)s=s.filter((function(t,e){return e%2==0})),l=l.filter((function(t,e){return e%2==0}));s=s.reduce((function(t,e,n){return n>0&&t.push("·"),t.push(e),t}),[]),l=l.reduce((function(t,e,n){return n>0&&t.push("·"),t.push(e),t}),[]),this.alphabet.length%2==0&&s.push("·"),t=s.concat(l.reverse())}this.visibleLetters=t},t.prototype.getNumHiddenHalves=function(t,e){return t>e/2?1+this.getNumHiddenHalves(t%(e/2),Math.ceil(e/2)):0},t.prototype.isActive=function(t){return this.letterIndex===t+1&&this.active},t.prototype.isActiveNeighbor1=function(t){return(t+1===this.letterIndex-1||t+1===this.letterIndex+1)&&this.active},t.prototype.isActiveNeighbor2=function(t){return(t+1===this.letterIndex-2||t+1===this.letterIndex+2)&&this.active},t.prototype.isActiveNeighbor3=function(t){return(t+1===this.letterIndex-3||t+1===this.letterIndex+3)&&this.active},t.prototype.touchStart=function(t){this.active=!0,this.touchMove(t)},t.prototype.touchMove=function(t){var e=t.touches[0].clientX,n=t.touches[0].clientY,i=this.getLetterIndexFromCoordinates(e,n);i&&this.onLetterIndexChange(i)},t.prototype.touchEnd=function(){this.endTouch.emit(),this.active=!1},t.prototype.mouseEnter=function(t){this.active=!0,this.mouseMove(t)},t.prototype.mouseMove=function(t){var e=t.clientX,n=t.clientY,i=this.getLetterIndexFromCoordinates(e,n);this.letterIndex=Math.round(i*(this.visibleLetters.length/this.alphabet.length)),this.navigateOnHover&&i&&this.onLetterIndexChange(i)},t.prototype.mouseLeave=function(t){this.active=!1},t.prototype.click=function(t){var e=t.clientX,n=t.clientY,i=this.getLetterIndexFromCoordinates(e,n);this.onLetterIndexChange(i)},t.prototype.getLetterIndexFromCoordinates=function(t,e){var n=null,i=this.alphabetContainer.nativeElement.getBoundingClientRect().top,o=this.alphabetContainer.nativeElement.clientHeight,r=Math.ceil((e-i)/o*this.alphabet.length),a=this.alphabetContainer.nativeElement.getBoundingClientRect().right,s=this.alphabetContainer.nativeElement.getBoundingClientRect().left;return r<=this.alphabet.length&&r>0&&(this.exactX?t<a&&t>s&&(n=Math.ceil(r)):n=Math.ceil(r)),n},t.prototype.onLetterIndexChange=function(t){if(t){var e=this.validLetters?this.getClosestValidLetter(t):this.alphabet[t-1];this.letterChange.emit(e)}},t.prototype.getClosestValidLetter=function(t){var e=this.alphabet.map((function(t){return t.toLowerCase()})),n=this.validLetters.map((function(t){return t.toLowerCase()})).map((function(t){return e.indexOf(t)+1})).reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}));return this.alphabet[n-1]},t}();o.decorators=[{type:e.Component,args:[{selector:"app-alphabetical-scroll-bar",template:'<div\n class="container"\n #alphabetContainer\n (touchmove)="touchStart($event)"\n (touchstart)="touchMove($event)"\n (touchend)="touchEnd()"\n (mouseenter)="mouseEnter($event)"\n (mousemove)="mouseMove($event)"\n (mouseleave)="mouseLeave($event)"\n (click)="click($event)"\n>\n <div\n *ngFor="let letter of visibleLetters; let i = index"\n class="letter"\n [class.active]="isActive(i) && letterMagnification"\n [class.active-neighbor-1]="isActiveNeighbor1(i) && letterMagnification"\n [class.active-neighbor-2]="isActiveNeighbor2(i) && letterMagnification"\n [class.active-neighbor-3]="isActiveNeighbor3(i) && letterMagnification"\n id="{{ visibleLetters[i] }}"\n >\n <label>{{ letter }}</label>\n </div>\n</div>\n',styles:[".container{align-items:center;display:flex;flex-direction:column;font-size:70%;height:100%;justify-content:space-evenly;padding-left:30px;padding-right:10px;width:20px}.container .letter{pointer-events:none;position:relative}.container .letter label{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);transition:font-size .1s}.container .letter.active{font-size:200%;font-weight:500}.container .letter.active-neighbor-1{font-size:175%}.container .letter.active-neighbor-2{font-size:150%}.container .letter.active-neighbor-3{font-size:125%}"]}]}],o.ctorParameters=function(){return[]},o.propDecorators={alphabetContainer:[{type:e.ViewChild,args:["alphabetContainer",{static:!0}]}],letterMagnification:[{type:e.Input}],exactX:[{type:e.Input}],alphabet:[{type:e.Input}],validLetters:[{type:e.Input}],navigateOnHover:[{type:e.Input}],letterChange:[{type:e.Output}],endTouch:[{type:e.Output}]};var r=function(){};r.decorators=[{type:e.NgModule,args:[{declarations:[o],imports:[n.CommonModule],exports:[o]}]}],t.AlphabeticalScrollBarComponent=o,t.AlphabeticalScrollBarModule=r,t.AlphabeticalScrollBarService=i,Object.defineProperty(t,"__esModule",{value:!0})}));
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/core"),require("@angular/common")):"function"==typeof define&&define.amd?define("alphabetical-scroll-bar",["exports","@angular/core","@angular/common"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["alphabetical-scroll-bar"]={},t.ng.core,t.ng.common)}(this,(function(t,e,n){"use strict";var i=function(){};i.ɵprov=e.ɵɵdefineInjectable({factory:function(){return new i},token:i,providedIn:"root"}),i.decorators=[{type:e.Injectable,args:[{providedIn:"root"}]}],i.ctorParameters=function(){return[]};var o=function(){function t(){this.letterMagnification=!1,this.exactX=!1,this.alphabet="abcdefghijklmnopqrstuvwxyz".toUpperCase().split(""),this.validLetters=void 0,this.navigateOnHover=!1,this.letterChange=new e.EventEmitter,this.endTouch=new e.EventEmitter,this.visibleLetters=[],this.active=!1,this.hidden=0}return t.prototype.ngOnInit=function(){var t=this,e=setInterval((function(){t.alphabetContainer.nativeElement.clientHeight>0&&(t.onResize(),window.addEventListener("resize",t.onResize.bind(t)),clearInterval(e))}),100)},t.prototype.ngOnDestroy=function(){window.removeEventListener("resize",this.onResize.bind(this))},t.prototype.onResize=function(){var t=this.alphabet,e=Number(window.getComputedStyle(document.body).getPropertyValue("font-size").match(/\d+/)[0]),n=this.alphabetContainer.nativeElement.clientHeight,i=Math.ceil(this.letterIndex*n/e);this.letterIndex=i,this.onLetterIndexChange(i);var o=this.alphabet.length;if(n/e<o){for(var r=o-Math.floor(n/e),a=this.getNumHiddenHalves(r,o)+1,s=this.alphabet.slice(0,Math.ceil(o/2)),l=this.alphabet.slice(Math.floor(o/2)).reverse(),c=0;c<a;c++)s=s.filter((function(t,e){return e%2==0})),l=l.filter((function(t,e){return e%2==0}));s=s.reduce((function(t,e,n){return n>0&&t.push("·"),t.push(e),t}),[]),l=l.reduce((function(t,e,n){return n>0&&t.push("·"),t.push(e),t}),[]),this.alphabet.length%2==0&&s.push("·"),t=s.concat(l.reverse())}this.visibleLetters=t},t.prototype.getNumHiddenHalves=function(t,e){return t>e/2?1+this.getNumHiddenHalves(t%(e/2),Math.ceil(e/2)):0},t.prototype.isActive=function(t){return this.letterIndex===t+1&&this.active},t.prototype.isActiveNeighbor1=function(t){return(t+1===this.letterIndex-1||t+1===this.letterIndex+1)&&this.active},t.prototype.isActiveNeighbor2=function(t){return(t+1===this.letterIndex-2||t+1===this.letterIndex+2)&&this.active},t.prototype.isActiveNeighbor3=function(t){return(t+1===this.letterIndex-3||t+1===this.letterIndex+3)&&this.active},t.prototype.touchStart=function(t){this.active=!0,this.touchMove(t)},t.prototype.touchMove=function(t){var e=t.touches[0].clientX,n=t.touches[0].clientY,i=this.getLetterIndexFromCoordinates(e,n);i&&this.onLetterIndexChange(i)},t.prototype.touchEnd=function(){this.endTouch.emit(),this.active=!1},t.prototype.mouseEnter=function(t){this.active=!0,this.mouseMove(t)},t.prototype.mouseMove=function(t){var e=t.clientX,n=t.clientY,i=this.getLetterIndexFromCoordinates(e,n);this.navigateOnHover&&i&&this.onLetterIndexChange(i)},t.prototype.mouseLeave=function(t){this.active=!1},t.prototype.click=function(t){var e=t.clientX,n=t.clientY,i=this.getLetterIndexFromCoordinates(e,n);this.onLetterIndexChange(i)},t.prototype.getLetterIndexFromCoordinates=function(t,e){var n=null,i=this.alphabetContainer.nativeElement.getBoundingClientRect().top,o=this.alphabetContainer.nativeElement.clientHeight,r=Math.ceil((e-i)/o*this.alphabet.length),a=this.alphabetContainer.nativeElement.getBoundingClientRect().right,s=this.alphabetContainer.nativeElement.getBoundingClientRect().left;return r<=this.alphabet.length&&r>0&&(this.exactX?t<a&&t>s&&(n=Math.ceil(r)):n=Math.ceil(r)),this.letterIndex=Math.round(n*(this.visibleLetters.length/this.alphabet.length)),n},t.prototype.onLetterIndexChange=function(t){if(t){var e=this.validLetters?this.getClosestValidLetter(t):this.alphabet[t-1];this.letterChange.emit(e)}},t.prototype.getClosestValidLetter=function(t){var e=this.alphabet.map((function(t){return t.toLowerCase()})),n=this.validLetters.map((function(t){return t.toLowerCase()})).map((function(t){return e.indexOf(t)+1})).reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}));return this.alphabet[n-1]},t}();o.decorators=[{type:e.Component,args:[{selector:"app-alphabetical-scroll-bar",template:'<div\n class="container"\n #alphabetContainer\n (touchmove)="touchStart($event)"\n (touchstart)="touchMove($event)"\n (touchend)="touchEnd()"\n (mouseenter)="mouseEnter($event)"\n (mousemove)="mouseMove($event)"\n (mouseleave)="mouseLeave($event)"\n (click)="click($event)"\n>\n <div\n *ngFor="let letter of visibleLetters; let i = index"\n class="letter"\n [class.active]="isActive(i) && letterMagnification"\n [class.active-neighbor-1]="isActiveNeighbor1(i) && letterMagnification"\n [class.active-neighbor-2]="isActiveNeighbor2(i) && letterMagnification"\n [class.active-neighbor-3]="isActiveNeighbor3(i) && letterMagnification"\n id="{{ visibleLetters[i] }}"\n >\n <label>{{ letter }}</label>\n </div>\n</div>\n',styles:[".container{align-items:center;display:flex;flex-direction:column;font-size:70%;height:100%;justify-content:space-evenly;padding-left:30px;padding-right:10px;width:20px}.container .letter{pointer-events:none;position:relative}.container .letter label{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);transition:font-size .1s}.container .letter.active{font-size:200%;font-weight:500}.container .letter.active-neighbor-1{font-size:175%}.container .letter.active-neighbor-2{font-size:150%}.container .letter.active-neighbor-3{font-size:125%}"]}]}],o.ctorParameters=function(){return[]},o.propDecorators={alphabetContainer:[{type:e.ViewChild,args:["alphabetContainer",{static:!0}]}],letterMagnification:[{type:e.Input}],exactX:[{type:e.Input}],alphabet:[{type:e.Input}],validLetters:[{type:e.Input}],navigateOnHover:[{type:e.Input}],letterChange:[{type:e.Output}],endTouch:[{type:e.Output}]};var r=function(){};r.decorators=[{type:e.NgModule,args:[{declarations:[o],imports:[n.CommonModule],exports:[o]}]}],t.AlphabeticalScrollBarComponent=o,t.AlphabeticalScrollBarModule=r,t.AlphabeticalScrollBarService=i,Object.defineProperty(t,"__esModule",{value:!0})}));
//# sourceMappingURL=alphabetical-scroll-bar.umd.min.js.map

@@ -126,3 +126,2 @@ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';

const newLetterIndex = this.getLetterIndexFromCoordinates(x, y);
this.letterIndex = Math.round(newLetterIndex * (this.visibleLetters.length / this.alphabet.length));
if (!this.navigateOnHover)

@@ -161,2 +160,3 @@ return;

}
this.letterIndex = Math.round(letterIndex * (this.visibleLetters.length / this.alphabet.length));
return letterIndex;

@@ -200,2 +200,2 @@ }

};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxwaGFiZXRpY2FsLXNjcm9sbC1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9nYWJlL3BhY2thZ2VzL2FscGhhYmV0aWNhbC1zY3JvbGwtYmFyL3Byb2plY3RzL2FscGhhYmV0aWNhbC1zY3JvbGwtYmFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9hbHBoYWJldGljYWwtc2Nyb2xsLWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFPdkIsTUFBTSxPQUFPLDhCQUE4QjtJQWlDekM7UUE1QkEsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBR3JDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsYUFBUSxHQUFrQiw0QkFBNEI7YUFDbkQsV0FBVyxFQUFFO2FBQ2IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBR2IsaUJBQVksR0FBa0IsU0FBUyxDQUFDO1FBR3hDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBR2pDLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFHaEUsYUFBUSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhELG1CQUFjLEdBQWtCLEVBQUUsQ0FBQztRQUVuQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXhCLFdBQU0sR0FBVyxDQUFDLENBQUM7SUFFSixDQUFDO0lBRWhCLFFBQVE7UUFDTixJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENB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QjtnQkFDdkMseXhCQUF1RDs7YUFFeEQ7Ozs7Z0NBRUUsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtrQ0FHL0MsS0FBSztxQkFHTCxLQUFLO3VCQUdMLEtBQUs7MkJBS0wsS0FBSzs4QkFHTCxLQUFLOzJCQUdMLE1BQU07dUJBR04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFscGhhYmV0aWNhbC1zY3JvbGwtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FscGhhYmV0aWNhbC1zY3JvbGwtYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWxwaGFiZXRpY2FsLXNjcm9sbC1iYXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQWxwaGFiZXRpY2FsU2Nyb2xsQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdhbHBoYWJldENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGFscGhhYmV0Q29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIGxldHRlck1hZ25pZmljYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBleGFjdFg6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBhbHBoYWJldDogQXJyYXk8c3RyaW5nPiA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidcbiAgICAudG9VcHBlckNhc2UoKVxuICAgIC5zcGxpdCgnJyk7XG5cbiAgQElucHV0KClcbiAgdmFsaWRMZXR0ZXJzOiBBcnJheTxzdHJpbmc+ID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIG5hdmlnYXRlT25Ib3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBsZXR0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGVuZFRvdWNoOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgdmlzaWJsZUxldHRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0dGVySW5kZXg6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaGlkZGVuOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBsZXQgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5hbHBoYWJldENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplLmJpbmQodGhpcykpO1xuICB9XG5cbiAgb25SZXNpemUoKSB7XG4gICAgbGV0IG5ld0FscGhhYmV0ID0gdGhpcy5hbHBoYWJldDtcblxuICAgIGNvbnN0IGxldHRlclNpemUgPSBOdW1iZXIoXG4gICAgICB3aW5kb3dcbiAgICAgICAgLmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSlcbiAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpXG4gICAgICAgIC5tYXRjaCgvXFxkKy8pWzBdXG4gICAgKTtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmFscGhhYmV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgY29uc3QgbmV3TGV0dGVySW5kZXggPSBNYXRoLmNlaWwoKHRoaXMubGV0dGVySW5kZXggKiBoZWlnaHQpIC8gbGV0dGVyU2l6ZSk7XG4gICAgdGhpcy5sZXR0ZXJJbmRleCA9IG5ld0xldHRlckluZGV4O1xuICAgIHRoaXMub25MZXR0ZXJJbmRleENoYW5nZShuZXdMZXR0ZXJJbmRleCk7XG5cbiAgICBjb25zdCBudW1MZXR0ZXJzID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgaWYgKGhlaWdodCAvIGxldHRlclNpemUgPCBudW1MZXR0ZXJzKSB7XG4gICAgICBjb25zdCBudW1IaWRkZW5MZXR0ZXJzID0gbnVtTGV0dGVycyAtIE1hdGguZmxvb3IoaGVpZ2h0IC8gbGV0dGVyU2l6ZSk7XG5cbiAgICAgIC8vZGV0ZXJtaW5lIGhvdyBtYW55IGxldHRlcnMgdG8gaGlkZVxuICAgICAgY29uc3QgaGlkZGVuSGFsdmVzID1cbiAgICAgICAgdGhpcy5nZXROdW1IaWRkZW5IYWx2ZXMobnVtSGlkZGVuTGV0dGVycywgbnVtTGV0dGVycykgKyAxO1xuXG4gICAgICAvL3NwbGl0IGFscGhhYmV0IGludG8gdHdvIGhhbHZlc1xuICAgICAgbGV0IGFscGhhYmV0MSA9IHRoaXMuYWxwaGFiZXQuc2xpY2UoMCwgTWF0aC5jZWlsKG51bUxldHRlcnMgLyAyKSk7XG4gICAgICBsZXQgYWxwaGFiZXQyID0gdGhpcy5hbHBoYWJldC5zbGljZShNYXRoLmZsb29yKG51bUxldHRlcnMgLyAyKSkucmV2ZXJzZSgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkhhbHZlczsgaSsrKSB7XG4gICAgICAgIGFscGhhYmV0MSA9IGFscGhhYmV0MS5maWx0ZXIoKGxldHRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICByZXR1cm4gaW5kZXggJSAyID09PSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgYWxwaGFiZXQyID0gYWxwaGFiZXQyLmZpbHRlcigobGV0dGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbmRleCAlIDIgPT09IDA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL2luc2VydCBkb3RzIGJldHdlZW4gbGV0dGVyc1xuICAgICAgYWxwaGFiZXQxID0gYWxwaGFiZXQxLnJlZHVjZSgocHJldiwgY3VyciwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBwcmV2LnB1c2goJ8K3Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcHJldi5wdXNoKGN1cnIpO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIFtdKTtcbiAgICAgIC8vaW5zZXJ0IGRvdHMgYmV0d2VlbiBsZXR0ZXJzXG4gICAgICBhbHBoYWJldDIgPSBhbHBoYWJldDIucmVkdWNlKChwcmV2LCBjdXJyLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHByZXYucHVzaCgnwrcnKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2LnB1c2goY3Vycik7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwgW10pO1xuXG4gICAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggJSAyID09PSAwKSBhbHBoYWJldDEucHVzaCgnwrcnKTtcblxuICAgICAgbmV3QWxwaGFiZXQgPSBhbHBoYWJldDEuY29uY2F0KGFscGhhYmV0Mi5yZXZlcnNlKCkpO1xuICAgIH1cblxuICAgIHRoaXMudmlzaWJsZUxldHRlcnMgPSBuZXdBbHBoYWJldDtcbiAgfVxuXG4gIGdldE51bUhpZGRlbkhhbHZlcyhudW1IaWRkZW5MZXR0ZXJzOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICBpZiAobnVtSGlkZGVuTGV0dGVycyA+IHRvdGFsIC8gMikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgMSArXG4gICAgICAgIHRoaXMuZ2V0TnVtSGlkZGVuSGFsdmVzKFxuICAgICAgICAgIG51bUhpZGRlbkxldHRlcnMgJSAodG90YWwgLyAyKSxcbiAgICAgICAgICBNYXRoLmNlaWwodG90YWwgLyAyKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlzQWN0aXZlKGk6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmxldHRlckluZGV4ID09PSBpICsgMSAmJiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIGlzQWN0aXZlTmVpZ2hib3IxKGk6IG51bWJlcikge1xuICAgIHJldHVybiAoXG4gICAgICAoaSArIDEgPT09IHRoaXMubGV0dGVySW5kZXggLSAxIHx8IGkgKyAxID09PSB0aGlzLmxldHRlckluZGV4ICsgMSkgJiZcbiAgICAgIHRoaXMuYWN0aXZlXG4gICAgKTtcbiAgfVxuXG4gIGlzQWN0aXZlTmVpZ2hib3IyKGk6IG51bWJlcikge1xuICAgIHJldHVybiAoXG4gICAgICAoaSArIDEgPT09IHRoaXMubGV0dGVySW5kZXggLSAyIHx8IGkgKyAxID09PSB0aGlzLmxldHRlckluZGV4ICsgMikgJiZcbiAgICAgIHRoaXMuYWN0aXZlXG4gICAgKTtcbiAgfVxuXG4gIGlzQWN0aXZlTmVpZ2hib3IzKGk6IG51bWJlcikge1xuICAgIHJldHVybiAoXG4gICAgICAoaSArIDEgPT09IHRoaXMubGV0dGVySW5kZXggLSAzIHx8IGkgKyAxID09PSB0aGlzLmxldHRlckluZGV4ICsgMykgJiZcbiAgICAgIHRoaXMuYWN0aXZlXG4gICAgKTtcbiAgfVxuXG4gIC8vKioqIFRvdWNoIEV2ZW50cyAqKiovL1xuICB0b3VjaFN0YXJ0KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy50b3VjaE1vdmUoZXZlbnQpO1xuICB9XG5cbiAgLy91cGRhdGVzIG9uIGV2ZXJ5IGZvcm0gb2YgdG91Y2hcbiAgdG91Y2hNb3ZlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB4ID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgIGNvbnN0IHkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG5cbiAgICBjb25zdCBuZXdMZXR0ZXJJbmRleCA9IHRoaXMuZ2V0TGV0dGVySW5kZXhGcm9tQ29vcmRpbmF0ZXMoeCwgeSk7XG5cbiAgICBpZiAobmV3TGV0dGVySW5kZXgpIHRoaXMub25MZXR0ZXJJbmRleENoYW5nZShuZXdMZXR0ZXJJbmRleCk7XG4gIH1cblxuICB0b3VjaEVuZCgpIHtcbiAgICB0aGlzLmVuZFRvdWNoLmVtaXQoKTtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8qKiogRW5kIFRvdWNoIEV2ZW50cyAqKiovL1xuXG4gIC8vKioqIE1vdXNlIEV2ZW50cyAqKiovL1xuXG4gIG1vdXNlRW50ZXIoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLm1vdXNlTW92ZShldmVudCk7XG4gIH1cblxuICBtb3VzZU1vdmUoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgY29uc3QgbmV3TGV0dGVySW5kZXggPSB0aGlzLmdldExldHRlckluZGV4RnJvbUNvb3JkaW5hdGVzKHgsIHkpO1xuXG4gICAgdGhpcy5sZXR0ZXJJbmRleCA9IE1hdGgucm91bmQoXG4gICAgICBuZXdMZXR0ZXJJbmRleCAqICh0aGlzLnZpc2libGVMZXR0ZXJzLmxlbmd0aCAvIHRoaXMuYWxwaGFiZXQubGVuZ3RoKVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMubmF2aWdhdGVPbkhvdmVyKSByZXR1cm47XG5cbiAgICBpZiAobmV3TGV0dGVySW5kZXgpIHRoaXMub25MZXR0ZXJJbmRleENoYW5nZShuZXdMZXR0ZXJJbmRleCk7XG4gIH1cblxuICBtb3VzZUxlYXZlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgY2xpY2soZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgY29uc3QgbmV3TGV0dGVySW5kZXggPSB0aGlzLmdldExldHRlckluZGV4RnJvbUNvb3JkaW5hdGVzKHgsIHkpO1xuXG4gICAgdGhpcy5vbkxldHRlckluZGV4Q2hhbmdlKG5ld0xldHRlckluZGV4KTtcbiAgfVxuXG4gIC8vKioqIEVuZCBNb3VzZSBFdmVudHMgKioqLy9cblxuICAvLyoqKiBMb2dpYyAqKiovL1xuXG4gIHByaXZhdGUgZ2V0TGV0dGVySW5kZXhGcm9tQ29vcmRpbmF0ZXMoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBsZXQgbGV0dGVySW5kZXggPSBudWxsO1xuICAgIGNvbnN0IGFUb3AgPVxuICAgICAgdGhpcy5hbHBoYWJldENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICBjb25zdCBhSGVpZ2h0ID0gdGhpcy5hbHBoYWJldENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguY2VpbCgoKHkgLSBhVG9wKSAvIGFIZWlnaHQpICogdGhpcy5hbHBoYWJldC5sZW5ndGgpO1xuICAgIGNvbnN0IGFSaWdodFggPVxuICAgICAgdGhpcy5hbHBoYWJldENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O1xuICAgIGNvbnN0IGFMZWZ0WCA9XG4gICAgICB0aGlzLmFscGhhYmV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgIGlmIChpbmRleCA8PSB0aGlzLmFscGhhYmV0Lmxlbmd0aCAmJiBpbmRleCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmV4YWN0WCkge1xuICAgICAgICBpZiAoeCA8IGFSaWdodFggJiYgeCA+IGFMZWZ0WCkge1xuICAgICAgICAgIGxldHRlckluZGV4ID0gTWF0aC5jZWlsKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0dGVySW5kZXggPSBNYXRoLmNlaWwoaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsZXR0ZXJJbmRleDtcbiAgfVxuXG4gIC8vZW1pdHMgdGhlIGxldHRlciBjaGFuZ2VcbiAgcHJpdmF0ZSBvbkxldHRlckluZGV4Q2hhbmdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgY29uc3QgbGV0dGVyID0gdGhpcy52YWxpZExldHRlcnNcbiAgICAgID8gdGhpcy5nZXRDbG9zZXN0VmFsaWRMZXR0ZXIodmFsdWUpXG4gICAgICA6IHRoaXMuYWxwaGFiZXRbdmFsdWUgLSAxXTtcbiAgICB0aGlzLmxldHRlckNoYW5nZS5lbWl0KGxldHRlcik7XG4gIH1cblxuICAvL2dldHMgY2xvc2VzdCBsZXR0ZXJcbiAgcHJpdmF0ZSBnZXRDbG9zZXN0VmFsaWRMZXR0ZXIobGV0dGVySW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGxvd2VyY2FzZUFscGhhYmV0ID0gdGhpcy5hbHBoYWJldC5tYXAoKGxldHRlcikgPT5cbiAgICAgIGxldHRlci50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICBjb25zdCBsb3dlcmNhc2VWYWxpZExldHRlcnMgPSB0aGlzLnZhbGlkTGV0dGVycy5tYXAoKGxldHRlcikgPT5cbiAgICAgIGxldHRlci50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICBjb25zdCB2YWxpZExldHRlcnNBc051bWJlcnMgPSBsb3dlcmNhc2VWYWxpZExldHRlcnMubWFwKFxuICAgICAgKGxldHRlcikgPT4gbG93ZXJjYXNlQWxwaGFiZXQuaW5kZXhPZihsZXR0ZXIpICsgMVxuICAgICk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0gdmFsaWRMZXR0ZXJzQXNOdW1iZXJzLnJlZHVjZSgocHJldiwgY3VycikgPT5cbiAgICAgIE1hdGguYWJzKGN1cnIgLSBsZXR0ZXJJbmRleCkgPCBNYXRoLmFicyhwcmV2IC0gbGV0dGVySW5kZXgpID8gY3VyciA6IHByZXZcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFscGhhYmV0W2Nsb3Nlc3QgLSAxXTtcbiAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxwaGFiZXRpY2FsLXNjcm9sbC1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9nYWJlL3BhY2thZ2VzL2FscGhhYmV0aWNhbC1zY3JvbGwtYmFyL3Byb2plY3RzL2FscGhhYmV0aWNhbC1zY3JvbGwtYmFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9hbHBoYWJldGljYWwtc2Nyb2xsLWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFPdkIsTUFBTSxPQUFPLDhCQUE4QjtJQWlDekM7UUE1QkEsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBR3JDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsYUFBUSxHQUFrQiw0QkFBNEI7YUFDbkQsV0FBVyxFQUFFO2FBQ2IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBR2IsaUJBQVksR0FBa0IsU0FBUyxDQUFDO1FBR3hDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBR2pDLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFHaEUsYUFBUSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhELG1CQUFjLEdBQWtCLEVBQUUsQ0FBQztRQUVuQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXhCLFdBQU0sR0FBVyxDQUFDLENBQUM7SUFFSixDQUFDO0lBRWhCLFFBQVE7UUFDTixJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENB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QjtnQkFDdkMseXhCQUF1RDs7YUFFeEQ7Ozs7Z0NBRUUsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtrQ0FHL0MsS0FBSztxQkFHTCxLQUFLO3VCQUdMLEtBQUs7MkJBS0wsS0FBSzs4QkFHTCxLQUFLOzJCQUdMLE1BQU07dUJBR04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFscGhhYmV0aWNhbC1zY3JvbGwtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FscGhhYmV0aWNhbC1zY3JvbGwtYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWxwaGFiZXRpY2FsLXNjcm9sbC1iYXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQWxwaGFiZXRpY2FsU2Nyb2xsQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdhbHBoYWJldENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGFscGhhYmV0Q29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIGxldHRlck1hZ25pZmljYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBleGFjdFg6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBhbHBoYWJldDogQXJyYXk8c3RyaW5nPiA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidcbiAgICAudG9VcHBlckNhc2UoKVxuICAgIC5zcGxpdCgnJyk7XG5cbiAgQElucHV0KClcbiAgdmFsaWRMZXR0ZXJzOiBBcnJheTxzdHJpbmc+ID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIG5hdmlnYXRlT25Ib3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBsZXR0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGVuZFRvdWNoOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgdmlzaWJsZUxldHRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0dGVySW5kZXg6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaGlkZGVuOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBsZXQgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5hbHBoYWJldENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplLmJpbmQodGhpcykpO1xuICB9XG5cbiAgb25SZXNpemUoKSB7XG4gICAgbGV0IG5ld0FscGhhYmV0ID0gdGhpcy5hbHBoYWJldDtcblxuICAgIGNvbnN0IGxldHRlclNpemUgPSBOdW1iZXIoXG4gICAgICB3aW5kb3dcbiAgICAgICAgLmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSlcbiAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpXG4gICAgICAgIC5tYXRjaCgvXFxkKy8pWzBdXG4gICAgKTtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmFscGhhYmV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgY29uc3QgbmV3TGV0dGVySW5kZXggPSBNYXRoLmNlaWwoKHRoaXMubGV0dGVySW5kZXggKiBoZWlnaHQpIC8gbGV0dGVyU2l6ZSk7XG4gICAgdGhpcy5sZXR0ZXJJbmRleCA9IG5ld0xldHRlckluZGV4O1xuICAgIHRoaXMub25MZXR0ZXJJbmRleENoYW5nZShuZXdMZXR0ZXJJbmRleCk7XG5cbiAgICBjb25zdCBudW1MZXR0ZXJzID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgaWYgKGhlaWdodCAvIGxldHRlclNpemUgPCBudW1MZXR0ZXJzKSB7XG4gICAgICBjb25zdCBudW1IaWRkZW5MZXR0ZXJzID0gbnVtTGV0dGVycyAtIE1hdGguZmxvb3IoaGVpZ2h0IC8gbGV0dGVyU2l6ZSk7XG5cbiAgICAgIC8vZGV0ZXJtaW5lIGhvdyBtYW55IGxldHRlcnMgdG8gaGlkZVxuICAgICAgY29uc3QgaGlkZGVuSGFsdmVzID1cbiAgICAgICAgdGhpcy5nZXROdW1IaWRkZW5IYWx2ZXMobnVtSGlkZGVuTGV0dGVycywgbnVtTGV0dGVycykgKyAxO1xuXG4gICAgICAvL3NwbGl0IGFscGhhYmV0IGludG8gdHdvIGhhbHZlc1xuICAgICAgbGV0IGFscGhhYmV0MSA9IHRoaXMuYWxwaGFiZXQuc2xpY2UoMCwgTWF0aC5jZWlsKG51bUxldHRlcnMgLyAyKSk7XG4gICAgICBsZXQgYWxwaGFiZXQyID0gdGhpcy5hbHBoYWJldC5zbGljZShNYXRoLmZsb29yKG51bUxldHRlcnMgLyAyKSkucmV2ZXJzZSgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkhhbHZlczsgaSsrKSB7XG4gICAgICAgIGFscGhhYmV0MSA9IGFscGhhYmV0MS5maWx0ZXIoKGxldHRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICByZXR1cm4gaW5kZXggJSAyID09PSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgYWxwaGFiZXQyID0gYWxwaGFiZXQyLmZpbHRlcigobGV0dGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbmRleCAlIDIgPT09IDA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL2luc2VydCBkb3RzIGJldHdlZW4gbGV0dGVyc1xuICAgICAgYWxwaGFiZXQxID0gYWxwaGFiZXQxLnJlZHVjZSgocHJldiwgY3VyciwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBwcmV2LnB1c2goJ8K3Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcHJldi5wdXNoKGN1cnIpO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIFtdKTtcbiAgICAgIC8vaW5zZXJ0IGRvdHMgYmV0d2VlbiBsZXR0ZXJzXG4gICAgICBhbHBoYWJldDIgPSBhbHBoYWJldDIucmVkdWNlKChwcmV2LCBjdXJyLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHByZXYucHVzaCgnwrcnKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2LnB1c2goY3Vycik7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwgW10pO1xuXG4gICAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggJSAyID09PSAwKSBhbHBoYWJldDEucHVzaCgnwrcnKTtcblxuICAgICAgbmV3QWxwaGFiZXQgPSBhbHBoYWJldDEuY29uY2F0KGFscGhhYmV0Mi5yZXZlcnNlKCkpO1xuICAgIH1cblxuICAgIHRoaXMudmlzaWJsZUxldHRlcnMgPSBuZXdBbHBoYWJldDtcbiAgfVxuXG4gIGdldE51bUhpZGRlbkhhbHZlcyhudW1IaWRkZW5MZXR0ZXJzOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICBpZiAobnVtSGlkZGVuTGV0dGVycyA+IHRvdGFsIC8gMikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgMSArXG4gICAgICAgIHRoaXMuZ2V0TnVtSGlkZGVuSGFsdmVzKFxuICAgICAgICAgIG51bUhpZGRlbkxldHRlcnMgJSAodG90YWwgLyAyKSxcbiAgICAgICAgICBNYXRoLmNlaWwodG90YWwgLyAyKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlzQWN0aXZlKGk6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmxldHRlckluZGV4ID09PSBpICsgMSAmJiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIGlzQWN0aXZlTmVpZ2hib3IxKGk6IG51bWJlcikge1xuICAgIHJldHVybiAoXG4gICAgICAoaSArIDEgPT09IHRoaXMubGV0dGVySW5kZXggLSAxIHx8IGkgKyAxID09PSB0aGlzLmxldHRlckluZGV4ICsgMSkgJiZcbiAgICAgIHRoaXMuYWN0aXZlXG4gICAgKTtcbiAgfVxuXG4gIGlzQWN0aXZlTmVpZ2hib3IyKGk6IG51bWJlcikge1xuICAgIHJldHVybiAoXG4gICAgICAoaSArIDEgPT09IHRoaXMubGV0dGVySW5kZXggLSAyIHx8IGkgKyAxID09PSB0aGlzLmxldHRlckluZGV4ICsgMikgJiZcbiAgICAgIHRoaXMuYWN0aXZlXG4gICAgKTtcbiAgfVxuXG4gIGlzQWN0aXZlTmVpZ2hib3IzKGk6IG51bWJlcikge1xuICAgIHJldHVybiAoXG4gICAgICAoaSArIDEgPT09IHRoaXMubGV0dGVySW5kZXggLSAzIHx8IGkgKyAxID09PSB0aGlzLmxldHRlckluZGV4ICsgMykgJiZcbiAgICAgIHRoaXMuYWN0aXZlXG4gICAgKTtcbiAgfVxuXG4gIC8vKioqIFRvdWNoIEV2ZW50cyAqKiovL1xuICB0b3VjaFN0YXJ0KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy50b3VjaE1vdmUoZXZlbnQpO1xuICB9XG5cbiAgLy91cGRhdGVzIG9uIGV2ZXJ5IGZvcm0gb2YgdG91Y2hcbiAgdG91Y2hNb3ZlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB4ID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgIGNvbnN0IHkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG5cbiAgICBjb25zdCBuZXdMZXR0ZXJJbmRleCA9IHRoaXMuZ2V0TGV0dGVySW5kZXhGcm9tQ29vcmRpbmF0ZXMoeCwgeSk7XG5cbiAgICBpZiAobmV3TGV0dGVySW5kZXgpIHRoaXMub25MZXR0ZXJJbmRleENoYW5nZShuZXdMZXR0ZXJJbmRleCk7XG4gIH1cblxuICB0b3VjaEVuZCgpIHtcbiAgICB0aGlzLmVuZFRvdWNoLmVtaXQoKTtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8qKiogRW5kIFRvdWNoIEV2ZW50cyAqKiovL1xuXG4gIC8vKioqIE1vdXNlIEV2ZW50cyAqKiovL1xuXG4gIG1vdXNlRW50ZXIoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLm1vdXNlTW92ZShldmVudCk7XG4gIH1cblxuICBtb3VzZU1vdmUoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgY29uc3QgbmV3TGV0dGVySW5kZXggPSB0aGlzLmdldExldHRlckluZGV4RnJvbUNvb3JkaW5hdGVzKHgsIHkpO1xuXG4gICAgaWYgKCF0aGlzLm5hdmlnYXRlT25Ib3ZlcikgcmV0dXJuO1xuXG4gICAgaWYgKG5ld0xldHRlckluZGV4KSB0aGlzLm9uTGV0dGVySW5kZXhDaGFuZ2UobmV3TGV0dGVySW5kZXgpO1xuICB9XG5cbiAgbW91c2VMZWF2ZShldmVudDogYW55KSB7XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIGNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGNvbnN0IG5ld0xldHRlckluZGV4ID0gdGhpcy5nZXRMZXR0ZXJJbmRleEZyb21Db29yZGluYXRlcyh4LCB5KTtcblxuICAgIHRoaXMub25MZXR0ZXJJbmRleENoYW5nZShuZXdMZXR0ZXJJbmRleCk7XG4gIH1cblxuICAvLyoqKiBFbmQgTW91c2UgRXZlbnRzICoqKi8vXG5cbiAgLy8qKiogTG9naWMgKioqLy9cblxuICBwcml2YXRlIGdldExldHRlckluZGV4RnJvbUNvb3JkaW5hdGVzKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgbGV0IGxldHRlckluZGV4ID0gbnVsbDtcbiAgICBjb25zdCBhVG9wID1cbiAgICAgIHRoaXMuYWxwaGFiZXRDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgY29uc3QgYUhlaWdodCA9IHRoaXMuYWxwaGFiZXRDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLmNlaWwoKCh5IC0gYVRvcCkgLyBhSGVpZ2h0KSAqIHRoaXMuYWxwaGFiZXQubGVuZ3RoKTtcbiAgICBjb25zdCBhUmlnaHRYID1cbiAgICAgIHRoaXMuYWxwaGFiZXRDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtcbiAgICBjb25zdCBhTGVmdFggPVxuICAgICAgdGhpcy5hbHBoYWJldENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cbiAgICBpZiAoaW5kZXggPD0gdGhpcy5hbHBoYWJldC5sZW5ndGggJiYgaW5kZXggPiAwKSB7XG4gICAgICBpZiAodGhpcy5leGFjdFgpIHtcbiAgICAgICAgaWYgKHggPCBhUmlnaHRYICYmIHggPiBhTGVmdFgpIHtcbiAgICAgICAgICBsZXR0ZXJJbmRleCA9IE1hdGguY2VpbChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldHRlckluZGV4ID0gTWF0aC5jZWlsKGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZXR0ZXJJbmRleCA9IE1hdGgucm91bmQoXG4gICAgICBsZXR0ZXJJbmRleCAqICh0aGlzLnZpc2libGVMZXR0ZXJzLmxlbmd0aCAvIHRoaXMuYWxwaGFiZXQubGVuZ3RoKVxuICAgICk7XG5cbiAgICByZXR1cm4gbGV0dGVySW5kZXg7XG4gIH1cblxuICAvL2VtaXRzIHRoZSBsZXR0ZXIgY2hhbmdlXG4gIHByaXZhdGUgb25MZXR0ZXJJbmRleENoYW5nZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGxldHRlciA9IHRoaXMudmFsaWRMZXR0ZXJzXG4gICAgICA/IHRoaXMuZ2V0Q2xvc2VzdFZhbGlkTGV0dGVyKHZhbHVlKVxuICAgICAgOiB0aGlzLmFscGhhYmV0W3ZhbHVlIC0gMV07XG4gICAgdGhpcy5sZXR0ZXJDaGFuZ2UuZW1pdChsZXR0ZXIpO1xuICB9XG5cbiAgLy9nZXRzIGNsb3Nlc3QgbGV0dGVyXG4gIHByaXZhdGUgZ2V0Q2xvc2VzdFZhbGlkTGV0dGVyKGxldHRlckluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBsb3dlcmNhc2VBbHBoYWJldCA9IHRoaXMuYWxwaGFiZXQubWFwKChsZXR0ZXIpID0+XG4gICAgICBsZXR0ZXIudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgY29uc3QgbG93ZXJjYXNlVmFsaWRMZXR0ZXJzID0gdGhpcy52YWxpZExldHRlcnMubWFwKChsZXR0ZXIpID0+XG4gICAgICBsZXR0ZXIudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgY29uc3QgdmFsaWRMZXR0ZXJzQXNOdW1iZXJzID0gbG93ZXJjYXNlVmFsaWRMZXR0ZXJzLm1hcChcbiAgICAgIChsZXR0ZXIpID0+IGxvd2VyY2FzZUFscGhhYmV0LmluZGV4T2YobGV0dGVyKSArIDFcbiAgICApO1xuXG4gICAgY29uc3QgY2xvc2VzdCA9IHZhbGlkTGV0dGVyc0FzTnVtYmVycy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+XG4gICAgICBNYXRoLmFicyhjdXJyIC0gbGV0dGVySW5kZXgpIDwgTWF0aC5hYnMocHJldiAtIGxldHRlckluZGV4KSA/IGN1cnIgOiBwcmV2XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hbHBoYWJldFtjbG9zZXN0IC0gMV07XG4gIH1cbn1cbiJdfQ==

@@ -139,3 +139,2 @@ import { ɵɵdefineInjectable, Injectable, EventEmitter, Component, ViewChild, Input, Output, NgModule } from '@angular/core';

const newLetterIndex = this.getLetterIndexFromCoordinates(x, y);
this.letterIndex = Math.round(newLetterIndex * (this.visibleLetters.length / this.alphabet.length));
if (!this.navigateOnHover)

@@ -174,2 +173,3 @@ return;

}
this.letterIndex = Math.round(letterIndex * (this.visibleLetters.length / this.alphabet.length));
return letterIndex;

@@ -176,0 +176,0 @@ }

{
"name": "alphabetical-scroll-bar",
"license": "MIT",
"version": "2.0.0",
"version": "2.0.1",
"peerDependencies": {

@@ -6,0 +6,0 @@ "@angular/common": "^10.1.6",

# Alphabetical Scroll Bar
This [Github](https://github.com/mooalot/alphabetical-scroll-bar) project shows an implementation of the `alphabetical-scroll-bar` in angular using Ionic Framework. The example can be found in `projects/example`. Below are images of what it can look like.
This project contains the source code for the `alphabetical-scroll-bar` and an example of how it is used in an ionic project (`projects/example`). Here are the basics of how it works, but I strongly suggest looking through the example for how to use it.
Inactive Scroll Bar | Active Scroll Bar
:-------------------------:|:-------------------------:
<img src="https://github.com/mooalot/alphabetical-scroll-bar/blob/main/projects/example/src/assets/image2.PNG" width="300"> | <img src="https://github.com/mooalot/alphabetical-scroll-bar/blob/main/projects/example/src/assets/image.PNG" width="300">
| Inactive Scroll Bar | Active Scroll Bar |
| :-------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: |
| <img src="https://github.com/mooalot/alphabetical-scroll-bar/blob/main/projects/example/src/assets/image2.PNG" width="300"> | <img src="https://github.com/mooalot/alphabetical-scroll-bar/blob/main/projects/example/src/assets/image.PNG" width="300"> |
## Version 2.0.0 and up
The following is how to use the `alphabetical-scroll-bar`.
New features:
- You can now use your own custom alphabet.
- Added support for desktop (see usage for more info).
- Scroll bar now supports all screen sizes by adding dividers between the letters as the screen size gets smaller.
## Support
| Platform | Support |
| -------- | ------- |
| iOS | Yes |
| Android | Yes |
| Web | Yes |
## Usage

@@ -19,2 +32,3 @@

```
Import in your desired `module.ts`

@@ -37,7 +51,8 @@

```
<app-alphabetical-scroll
[letterMagnification]="Boolean"
[exactX]="Boolean"
<app-alphabetical-scroll
[letterMagnification]="Boolean"
[exactX]="Boolean"
[customAlphabet]="Array<string>"
[validLetters]="Array<string>"
[validLetters]="Array<string>"
[navigateOnHover]="Boolean"
(letterChange)="EventEmitter<string>"

@@ -48,7 +63,7 @@ (endTouch)="EventEmitter<void>">

**letterMagnification** defaults to `true`. This feature will create a magnification effect on the alphabetical scroll bar when the user touches it.
**letterMagnification** defaults to `true`. This feature will create a magnification effect on the alphabetical scroll bar when the user touches it or hovers over it.
**exactX** defaults to `false`. When `false`, this means the user does not have to be accurate along the x direction of the screen (after they have touched the scroll bar), meaning they can slide their finger freely along the x axis while still changing the scroll value. If set to `true`, the user will have to remain inside the scroll bar to continue navigating (I think false gives it a smoother feel).
**exactX** defaults to `false`. When `false`, this means the user does not have to be accurate along the x direction of the screen (after they have touched the scroll bar), meaning they can slide their finger freely along the x axis while still changing the scroll value. If set to `true`, the user will have to remain inside the scroll bar to continue navigating (I think false gives it a smoother feel). (MOBILE ONLY)
**customAlphabet** allows you to enter your own custom version of the alphabet. It defaults to an all caps alphabet. If the length is not exactly 26 characters, it will default to the all caps alphabet as well.
**alphabet** allows you to enter your own custom version of the alphabet. It defaults to an all caps alphabet.

@@ -59,6 +74,8 @@ **validLetters** is an array of the possible letters that are available in the scrollable content. For example, if you only have 5 different letter dividers `A`, `D`, `F`, `I`, and `R`, you would want to pass these into `validLetters`. If you did not, when you tap on `Z` in the alphabetical scroll bar, nothing will happen. If you do include `validLetters`, your view would be taken to the next closest letter, which in this case is `R`. This is not a requirement, but it will make your alphabetical scroll bar much more robust.

**endTouch** is an eventEmitter that will emit when the user releases their finger from the scroll bar. This is used to stop any unwanted scroll glitches while the user is using the alphabetical scroll bar. See example for more information.
**endTouch** is an eventEmitter that will emit when the user releases their finger from the scroll bar. This is used to stop any unwanted scroll glitches while the user is using the alphabetical scroll bar. See example for more information. (MOBILE ONLY)
*You can see how all of these are used in the example project on [Github](https://github.com/mooalot/alphabetical-scroll-bar).*
_You can see how all of these are used in the `projects/example` folder._
*Also note that the `app-alphabetical-scroll` element must have a high z-index to be above dividers and other elements.
**navigateOnHover** defaults to `false`. This means that the user will have to tap on the scroll bar to navigate to a new letter. If set to `true`, the user will be able to navigate to a new letter by hovering over the scroll bar. (DESKTOP ONLY)
\*Also note that the `app-alphabetical-scroll` element must have a high z-index to be above dividers and other elements.

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc