tango-app-ui-analyse-trax 4.0.21 → 4.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,123 @@
1
+ import { Directive, EventEmitter, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ // Sideways scrolling by mouse for a strip whose scrollbar is hidden: a plain wheel turn scrolls it
4
+ // sideways (trackpads already do), and it can be dragged with the left button. At either end the
5
+ // wheel is handed back to the page. Listeners run outside Angular, so scrolling doesn't run change
6
+ // detection per frame; scrollStart fires once per burst of scrolling, inside Angular.
7
+ export class DragScrollDirective {
8
+ host;
9
+ zone;
10
+ scrollStart = new EventEmitter();
11
+ dragStartX = 0;
12
+ dragStartLeft = 0;
13
+ dragging = false;
14
+ scrolling = false;
15
+ scrollIdle = null;
16
+ constructor(host, zone) {
17
+ this.host = host;
18
+ this.zone = zone;
19
+ }
20
+ ngOnInit() {
21
+ const el = this.host.nativeElement;
22
+ this.zone.runOutsideAngular(() => {
23
+ el.addEventListener('wheel', this.onWheel, { passive: false });
24
+ el.addEventListener('pointerdown', this.onPointerDown);
25
+ el.addEventListener('pointerenter', this.onPointerEnter);
26
+ el.addEventListener('scroll', this.onScroll, { passive: true });
27
+ });
28
+ }
29
+ ngOnDestroy() {
30
+ const el = this.host.nativeElement;
31
+ el.removeEventListener('wheel', this.onWheel);
32
+ el.removeEventListener('pointerdown', this.onPointerDown);
33
+ el.removeEventListener('pointerenter', this.onPointerEnter);
34
+ el.removeEventListener('scroll', this.onScroll);
35
+ this.endDrag();
36
+ clearTimeout(this.scrollIdle);
37
+ }
38
+ get maxScroll() {
39
+ const el = this.host.nativeElement;
40
+ return el.scrollWidth - el.clientWidth;
41
+ }
42
+ // Grab cursor only while there is something to scroll to.
43
+ onPointerEnter = () => {
44
+ this.host.nativeElement.classList.toggle('drag-scroll-ready', this.maxScroll > 0);
45
+ };
46
+ onWheel = (event) => {
47
+ const el = this.host.nativeElement;
48
+ const max = this.maxScroll;
49
+ if (max <= 0 || event.ctrlKey || Math.abs(event.deltaX) >= Math.abs(event.deltaY)) {
50
+ return;
51
+ }
52
+ const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? el.clientWidth : 1;
53
+ const delta = event.deltaY * unit;
54
+ if ((delta < 0 && el.scrollLeft <= 0) || (delta > 0 && el.scrollLeft >= max - 1)) {
55
+ return;
56
+ }
57
+ event.preventDefault();
58
+ el.scrollLeft += delta;
59
+ };
60
+ onPointerDown = (event) => {
61
+ if (event.pointerType !== 'mouse' || event.button !== 0 || this.maxScroll <= 0) {
62
+ return;
63
+ }
64
+ const el = this.host.nativeElement;
65
+ this.dragStartX = event.clientX;
66
+ this.dragStartLeft = el.scrollLeft;
67
+ this.dragging = false;
68
+ el.addEventListener('pointermove', this.onPointerMove);
69
+ el.addEventListener('pointerup', this.onPointerUp);
70
+ el.addEventListener('pointercancel', this.onPointerUp);
71
+ };
72
+ // A few pixels of slack so a plain click never nudges the strip.
73
+ onPointerMove = (event) => {
74
+ const el = this.host.nativeElement;
75
+ const dx = event.clientX - this.dragStartX;
76
+ if (!this.dragging) {
77
+ if (Math.abs(dx) < 4) {
78
+ return;
79
+ }
80
+ this.dragging = true;
81
+ el.setPointerCapture(event.pointerId);
82
+ el.classList.add('drag-scroll-active');
83
+ }
84
+ el.scrollLeft = this.dragStartLeft - dx;
85
+ };
86
+ onPointerUp = (event) => {
87
+ const el = this.host.nativeElement;
88
+ if (el.hasPointerCapture(event.pointerId)) {
89
+ el.releasePointerCapture(event.pointerId);
90
+ }
91
+ this.endDrag();
92
+ };
93
+ endDrag() {
94
+ const el = this.host.nativeElement;
95
+ el.removeEventListener('pointermove', this.onPointerMove);
96
+ el.removeEventListener('pointerup', this.onPointerUp);
97
+ el.removeEventListener('pointercancel', this.onPointerUp);
98
+ el.classList.remove('drag-scroll-active');
99
+ this.dragging = false;
100
+ }
101
+ onScroll = () => {
102
+ if (!this.scrolling) {
103
+ this.scrolling = true;
104
+ if (this.scrollStart.observed) {
105
+ this.zone.run(() => this.scrollStart.emit());
106
+ }
107
+ }
108
+ clearTimeout(this.scrollIdle);
109
+ this.scrollIdle = setTimeout(() => (this.scrolling = false), 150);
110
+ };
111
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DragScrollDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
112
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: DragScrollDirective, isStandalone: true, selector: "[libDragScroll]", outputs: { scrollStart: "scrollStart" }, ngImport: i0 });
113
+ }
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DragScrollDirective, decorators: [{
115
+ type: Directive,
116
+ args: [{
117
+ selector: '[libDragScroll]',
118
+ standalone: true,
119
+ }]
120
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { scrollStart: [{
121
+ type: Output
122
+ }] } });
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy9mbGFncy1pbmZvL2RyYWctc2Nyb2xsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBNkIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUV2RyxtR0FBbUc7QUFDbkcsaUdBQWlHO0FBQ2pHLG1HQUFtRztBQUNuRyxzRkFBc0Y7QUFLdEYsTUFBTSxPQUFPLG1CQUFtQjtJQVNWO0lBQXVDO0lBUmpELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFBO0lBRXhDLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFDZCxhQUFhLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUE7SUFDaEIsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUNqQixVQUFVLEdBQVEsSUFBSSxDQUFBO0lBRTlCLFlBQW9CLElBQTZCLEVBQVUsSUFBWTtRQUFuRCxTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7SUFBRyxDQUFDO0lBRTNFLFFBQVE7UUFDTixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUM5RCxFQUFFLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUN0RCxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FB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R1UsbUJBQW1COzRGQUFuQixtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBSi9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO29HQUVXLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBTaWRld2F5cyBzY3JvbGxpbmcgYnkgbW91c2UgZm9yIGEgc3RyaXAgd2hvc2Ugc2Nyb2xsYmFyIGlzIGhpZGRlbjogYSBwbGFpbiB3aGVlbCB0dXJuIHNjcm9sbHMgaXRcclxuLy8gc2lkZXdheXMgKHRyYWNrcGFkcyBhbHJlYWR5IGRvKSwgYW5kIGl0IGNhbiBiZSBkcmFnZ2VkIHdpdGggdGhlIGxlZnQgYnV0dG9uLiBBdCBlaXRoZXIgZW5kIHRoZVxyXG4vLyB3aGVlbCBpcyBoYW5kZWQgYmFjayB0byB0aGUgcGFnZS4gTGlzdGVuZXJzIHJ1biBvdXRzaWRlIEFuZ3VsYXIsIHNvIHNjcm9sbGluZyBkb2Vzbid0IHJ1biBjaGFuZ2VcclxuLy8gZGV0ZWN0aW9uIHBlciBmcmFtZTsgc2Nyb2xsU3RhcnQgZmlyZXMgb25jZSBwZXIgYnVyc3Qgb2Ygc2Nyb2xsaW5nLCBpbnNpZGUgQW5ndWxhci5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbGliRHJhZ1Njcm9sbF0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmFnU2Nyb2xsRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBPdXRwdXQoKSBzY3JvbGxTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxyXG5cclxuICBwcml2YXRlIGRyYWdTdGFydFggPSAwXHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRMZWZ0ID0gMFxyXG4gIHByaXZhdGUgZHJhZ2dpbmcgPSBmYWxzZVxyXG4gIHByaXZhdGUgc2Nyb2xsaW5nID0gZmFsc2VcclxuICBwcml2YXRlIHNjcm9sbElkbGU6IGFueSA9IG51bGxcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudFxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwsIHsgcGFzc2l2ZTogZmFsc2UgfSlcclxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pXHJcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsIHRoaXMub25Qb2ludGVyRW50ZXIpXHJcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudFxyXG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwpXHJcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Qb2ludGVyRG93bilcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsIHRoaXMub25Qb2ludGVyRW50ZXIpXHJcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsKVxyXG4gICAgdGhpcy5lbmREcmFnKClcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbElkbGUpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBtYXhTY3JvbGwoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnRcclxuICAgIHJldHVybiBlbC5zY3JvbGxXaWR0aCAtIGVsLmNsaWVudFdpZHRoXHJcbiAgfVxyXG5cclxuICAvLyBHcmFiIGN1cnNvciBvbmx5IHdoaWxlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzY3JvbGwgdG8uXHJcbiAgcHJpdmF0ZSBvblBvaW50ZXJFbnRlciA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2RyYWctc2Nyb2xsLXJlYWR5JywgdGhpcy5tYXhTY3JvbGwgPiAwKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbldoZWVsID0gKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLm1heFNjcm9sbFxyXG4gICAgaWYgKG1heCA8PSAwIHx8IGV2ZW50LmN0cmxLZXkgfHwgTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA+PSBNYXRoLmFicyhldmVudC5kZWx0YVkpKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgY29uc3QgdW5pdCA9IGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDE2IDogZXZlbnQuZGVsdGFNb2RlID09PSAyID8gZWwuY2xpZW50V2lkdGggOiAxXHJcbiAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmRlbHRhWSAqIHVuaXRcclxuICAgIGlmICgoZGVsdGEgPCAwICYmIGVsLnNjcm9sbExlZnQgPD0gMCkgfHwgKGRlbHRhID4gMCAmJiBlbC5zY3JvbGxMZWZ0ID49IG1heCAtIDEpKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgZWwuc2Nyb2xsTGVmdCArPSBkZWx0YVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJyB8fCBldmVudC5idXR0b24gIT09IDAgfHwgdGhpcy5tYXhTY3JvbGwgPD0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnRcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IGV2ZW50LmNsaWVudFhcclxuICAgIHRoaXMuZHJhZ1N0YXJ0TGVmdCA9IGVsLnNjcm9sbExlZnRcclxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpXHJcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKVxyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMub25Qb2ludGVyVXApXHJcbiAgfVxyXG5cclxuICAvLyBBIGZldyBwaXhlbHMgb2Ygc2xhY2sgc28gYSBwbGFpbiBjbGljayBuZXZlciBudWRnZXMgdGhlIHN0cmlwLlxyXG4gIHByaXZhdGUgb25Qb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50XHJcbiAgICBjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmRyYWdTdGFydFhcclxuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xyXG4gICAgICBpZiAoTWF0aC5hYnMoZHgpIDwgNCkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlXHJcbiAgICAgIGVsLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZClcclxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZHJhZy1zY3JvbGwtYWN0aXZlJylcclxuICAgIH1cclxuICAgIGVsLnNjcm9sbExlZnQgPSB0aGlzLmRyYWdTdGFydExlZnQgLSBkeFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblBvaW50ZXJVcCA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50XHJcbiAgICBpZiAoZWwuaGFzUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKSkge1xyXG4gICAgICBlbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbmREcmFnKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kRHJhZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnRcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKVxyXG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcClcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwKVxyXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1zY3JvbGwtYWN0aXZlJylcclxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcclxuICAgIGlmICghdGhpcy5zY3JvbGxpbmcpIHtcclxuICAgICAgdGhpcy5zY3JvbGxpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLnNjcm9sbFN0YXJ0Lm9ic2VydmVkKSB7XHJcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLnNjcm9sbFN0YXJ0LmVtaXQoKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsSWRsZSlcclxuICAgIHRoaXMuc2Nyb2xsSWRsZSA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuc2Nyb2xsaW5nID0gZmFsc2UpLCAxNTApXHJcbiAgfVxyXG59XHJcbiJdfQ==