@libs-ui/components-scroll-measure-items-direction-horizontal 0.2.356-20 → 0.2.356-21
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.
- package/direction-horizontal.directive.d.ts +9 -9
- package/esm2022/direction-horizontal.directive.mjs +69 -55
- package/esm2022/interfaces/direction-horizontal.interface.mjs +1 -1
- package/fesm2022/libs-ui-components-scroll-measure-items-direction-horizontal.mjs +68 -54
- package/fesm2022/libs-ui-components-scroll-measure-items-direction-horizontal.mjs.map +1 -1
- package/interfaces/direction-horizontal.interface.d.ts +7 -0
- package/package.json +2 -2
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { AfterViewInit
|
|
1
|
+
import { AfterViewInit } from '@angular/core';
|
|
2
2
|
import { IScrollMeasureItemDirectionHorizontalFunctionsControl } from './interfaces/direction-horizontal.interface';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class LibsUiScrollMeasureItemDirectionHorizontalDirective implements AfterViewInit
|
|
5
|
-
viewPortItems
|
|
4
|
+
export declare class LibsUiScrollMeasureItemDirectionHorizontalDirective implements AfterViewInit {
|
|
5
|
+
private viewPortItems;
|
|
6
6
|
private start;
|
|
7
7
|
private end;
|
|
8
8
|
private storeItems;
|
|
9
9
|
private divVirtual;
|
|
10
|
-
private onDestroy;
|
|
11
10
|
readonly elementScroll: import("@angular/core").InputSignal<HTMLElement>;
|
|
12
11
|
readonly functionGetWidthItem: import("@angular/core").InputSignal<(item: any) => Promise<number>>;
|
|
13
12
|
readonly items: import("@angular/core").InputSignal<any[]>;
|
|
14
|
-
readonly outViewPortItem: import("@angular/core").OutputEmitterRef<
|
|
13
|
+
readonly outViewPortItem: import("@angular/core").OutputEmitterRef<any[]>;
|
|
15
14
|
readonly outFunctionControl: import("@angular/core").OutputEmitterRef<IScrollMeasureItemDirectionHorizontalFunctionsControl>;
|
|
16
15
|
readonly outDivVirtual: import("@angular/core").OutputEmitterRef<HTMLDivElement>;
|
|
17
|
-
|
|
16
|
+
readonly outPaddingLeft: import("@angular/core").OutputEmitterRef<number>;
|
|
17
|
+
private readonly elementRef;
|
|
18
|
+
private readonly destroyRef;
|
|
18
19
|
constructor();
|
|
19
20
|
ngAfterViewInit(): void;
|
|
20
|
-
private get ElementScroll();
|
|
21
21
|
get FunctionsControl(): IScrollMeasureItemDirectionHorizontalFunctionsControl;
|
|
22
|
+
private get ScrollContainer();
|
|
22
23
|
private handlerScroll;
|
|
23
24
|
private scrollInto;
|
|
24
25
|
private scrollToPosition;
|
|
25
26
|
private scrollToIndex;
|
|
26
27
|
private reCalculatorViewPort;
|
|
27
|
-
ngOnDestroy(): void;
|
|
28
28
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiScrollMeasureItemDirectionHorizontalDirective, never>;
|
|
29
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiScrollMeasureItemDirectionHorizontalDirective, "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", never, { "elementScroll": { "alias": "elementScroll"; "required": true; "isSignal": true; }; "functionGetWidthItem": { "alias": "functionGetWidthItem"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "outViewPortItem": "outViewPortItem"; "outFunctionControl": "outFunctionControl"; "outDivVirtual": "outDivVirtual"; }, never, never, true, never>;
|
|
29
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiScrollMeasureItemDirectionHorizontalDirective, "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", never, { "elementScroll": { "alias": "elementScroll"; "required": true; "isSignal": true; }; "functionGetWidthItem": { "alias": "functionGetWidthItem"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "outViewPortItem": "outViewPortItem"; "outFunctionControl": "outFunctionControl"; "outDivVirtual": "outDivVirtual"; "outPaddingLeft": "outPaddingLeft"; }, never, never, true, never>;
|
|
30
30
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
// CONVENTION-EXCEPT: any — Generic directive works with unknown item types from consumer
|
|
1
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Directive, ElementRef, effect, inject, input, output, signal, untracked } from '@angular/core';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { DestroyRef, Directive, ElementRef, effect, inject, input, output, signal, untracked } from '@angular/core';
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { get } from '@libs-ui/utils';
|
|
6
|
+
import { fromEvent } from 'rxjs';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
6
8
|
export class LibsUiScrollMeasureItemDirectionHorizontalDirective {
|
|
7
9
|
// #region PROPERTY
|
|
@@ -10,7 +12,6 @@ export class LibsUiScrollMeasureItemDirectionHorizontalDirective {
|
|
|
10
12
|
end = signal(0);
|
|
11
13
|
storeItems = signal([]);
|
|
12
14
|
divVirtual = document.createElement('div');
|
|
13
|
-
onDestroy = new Subject();
|
|
14
15
|
// #region INPUT
|
|
15
16
|
elementScroll = input.required();
|
|
16
17
|
functionGetWidthItem = input.required();
|
|
@@ -19,134 +20,147 @@ export class LibsUiScrollMeasureItemDirectionHorizontalDirective {
|
|
|
19
20
|
outViewPortItem = output();
|
|
20
21
|
outFunctionControl = output();
|
|
21
22
|
outDivVirtual = output();
|
|
23
|
+
outPaddingLeft = output();
|
|
22
24
|
// #region INJECT
|
|
23
25
|
elementRef = inject(ElementRef);
|
|
26
|
+
destroyRef = inject(DestroyRef);
|
|
24
27
|
constructor() {
|
|
25
28
|
effect(() => {
|
|
26
|
-
|
|
29
|
+
const scrollEl = untracked(() => this.ScrollContainer);
|
|
30
|
+
if (!scrollEl || !untracked(() => this.functionGetWidthItem())) {
|
|
27
31
|
return;
|
|
28
32
|
}
|
|
29
33
|
const items = this.items();
|
|
30
34
|
untracked(async () => {
|
|
31
35
|
this.start.set(0);
|
|
32
|
-
const
|
|
36
|
+
const scrollLeft = scrollEl.scrollLeft;
|
|
37
|
+
const containerWidth = scrollEl.getBoundingClientRect().width;
|
|
33
38
|
let width = 0;
|
|
34
39
|
const newItems = [];
|
|
35
|
-
for (
|
|
36
|
-
const item = items[
|
|
37
|
-
const newItem =
|
|
38
|
-
newItem.ref = item;
|
|
40
|
+
for (let i = 0; i < items.length; i++) {
|
|
41
|
+
const item = items[i];
|
|
42
|
+
const newItem = { ref: item, itemWidth: 0, start: 0, end: 0 };
|
|
39
43
|
const itemWidth = await this.functionGetWidthItem()(item);
|
|
40
44
|
newItem.itemWidth = itemWidth;
|
|
41
45
|
newItem.start = width;
|
|
42
46
|
width += itemWidth;
|
|
43
47
|
newItem.end = width;
|
|
44
|
-
if (newItem.end <=
|
|
45
|
-
this.end.set(
|
|
48
|
+
if (newItem.end <= containerWidth + scrollLeft) {
|
|
49
|
+
this.end.set(i);
|
|
46
50
|
}
|
|
47
51
|
newItems.push(newItem);
|
|
48
52
|
}
|
|
49
53
|
this.storeItems.set(newItems);
|
|
50
54
|
this.viewPortItems.set(this.storeItems()
|
|
51
55
|
.slice(this.start(), this.end() + 3)
|
|
52
|
-
.map((item) => item
|
|
56
|
+
.map((item) => item.ref));
|
|
53
57
|
this.outViewPortItem.emit(this.viewPortItems());
|
|
58
|
+
this.outPaddingLeft.emit(get(this.storeItems(), `[${this.start()}].start`, 0));
|
|
54
59
|
this.divVirtual.style.position = 'absolute';
|
|
60
|
+
this.divVirtual.style.top = '0px';
|
|
61
|
+
this.divVirtual.style.left = '0px';
|
|
55
62
|
this.divVirtual.style.width = `${width}px`;
|
|
56
63
|
this.divVirtual.style.height = '1px';
|
|
64
|
+
this.divVirtual.style.visibility = 'hidden';
|
|
57
65
|
this.elementRef.nativeElement.classList.add('relative');
|
|
58
66
|
this.elementRef.nativeElement.classList.remove('w-full');
|
|
59
|
-
this.elementRef.nativeElement.style.paddingLeft =
|
|
60
|
-
|
|
67
|
+
this.elementRef.nativeElement.style.paddingLeft = '0px';
|
|
68
|
+
scrollEl.append(this.divVirtual);
|
|
61
69
|
this.outDivVirtual.emit(this.divVirtual);
|
|
62
70
|
});
|
|
63
71
|
});
|
|
72
|
+
this.destroyRef.onDestroy(() => {
|
|
73
|
+
this.divVirtual.remove();
|
|
74
|
+
});
|
|
64
75
|
}
|
|
65
76
|
ngAfterViewInit() {
|
|
66
77
|
setTimeout(() => {
|
|
67
|
-
fromEvent(this.
|
|
78
|
+
fromEvent(this.ScrollContainer, 'scroll')
|
|
79
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
80
|
+
.subscribe(() => this.handlerScroll());
|
|
68
81
|
this.outFunctionControl.emit(this.FunctionsControl);
|
|
69
82
|
});
|
|
70
83
|
}
|
|
71
|
-
|
|
72
|
-
return this.elementScroll() || this.elementRef.nativeElement;
|
|
73
|
-
}
|
|
74
|
-
/* FUNCTIONS */
|
|
84
|
+
// #region PUBLIC API
|
|
75
85
|
get FunctionsControl() {
|
|
76
86
|
return {
|
|
77
87
|
scrollInto: this.scrollInto.bind(this),
|
|
78
88
|
scrollToPosition: this.scrollToPosition.bind(this),
|
|
79
89
|
scrollToIndex: this.scrollToIndex.bind(this),
|
|
80
90
|
reCalculatorViewPort: this.reCalculatorViewPort.bind(this),
|
|
91
|
+
getViewPortItems: () => this.viewPortItems(),
|
|
81
92
|
};
|
|
82
93
|
}
|
|
94
|
+
// #region PRIVATE METHODS
|
|
95
|
+
get ScrollContainer() {
|
|
96
|
+
return this.elementScroll() || this.elementRef.nativeElement;
|
|
97
|
+
}
|
|
83
98
|
handlerScroll() {
|
|
84
|
-
|
|
99
|
+
const store = this.storeItems();
|
|
100
|
+
if (!store?.length) {
|
|
85
101
|
return;
|
|
86
102
|
}
|
|
87
|
-
const
|
|
103
|
+
const scrollEl = this.ScrollContainer;
|
|
104
|
+
const scrollLeft = scrollEl.scrollLeft;
|
|
105
|
+
const containerWidth = scrollEl.getBoundingClientRect().width;
|
|
88
106
|
let start = this.start();
|
|
89
107
|
let isSetStartPositioned = false;
|
|
90
|
-
for (
|
|
91
|
-
const item =
|
|
92
|
-
if (item
|
|
108
|
+
for (let i = 0; i < store.length; i++) {
|
|
109
|
+
const item = store[i];
|
|
110
|
+
if (item.end > containerWidth + scrollLeft) {
|
|
93
111
|
break;
|
|
94
112
|
}
|
|
95
|
-
this.end.set(
|
|
96
|
-
if (item
|
|
97
|
-
start =
|
|
113
|
+
this.end.set(i);
|
|
114
|
+
if (item.end >= scrollLeft && !isSetStartPositioned) {
|
|
115
|
+
start = i;
|
|
98
116
|
isSetStartPositioned = true;
|
|
99
117
|
}
|
|
100
118
|
}
|
|
101
119
|
if (start !== this.start()) {
|
|
102
120
|
this.start.set(start);
|
|
103
|
-
|
|
121
|
+
const paddingLeft = store[start].start;
|
|
122
|
+
this.elementRef.nativeElement.style.paddingLeft = `${paddingLeft}px`;
|
|
123
|
+
this.outPaddingLeft.emit(paddingLeft);
|
|
104
124
|
}
|
|
105
125
|
if (this.start() < 0) {
|
|
106
126
|
this.start.set(0);
|
|
107
127
|
}
|
|
108
|
-
this.viewPortItems.set(this.
|
|
109
|
-
.slice(this.start(), this.end() + 3)
|
|
110
|
-
.map((item) => item['ref']));
|
|
128
|
+
this.viewPortItems.set(store.slice(this.start(), this.end() + 3).map((item) => item.ref));
|
|
111
129
|
this.outViewPortItem.emit(this.viewPortItems());
|
|
112
130
|
}
|
|
113
131
|
async scrollInto(itemScroll) {
|
|
114
|
-
const itemFound = this.storeItems().find((item) => item
|
|
115
|
-
if (itemFound) {
|
|
116
|
-
|
|
132
|
+
const itemFound = this.storeItems().find((item) => item.ref === itemScroll);
|
|
133
|
+
if (!itemFound) {
|
|
134
|
+
return;
|
|
117
135
|
}
|
|
136
|
+
this.ScrollContainer.scrollLeft = itemFound.start;
|
|
118
137
|
}
|
|
119
138
|
async scrollToPosition(position) {
|
|
120
|
-
this.
|
|
139
|
+
this.ScrollContainer.scrollLeft = position;
|
|
121
140
|
}
|
|
122
141
|
async scrollToIndex(index) {
|
|
123
142
|
const itemOfIndex = this.storeItems()[index];
|
|
124
|
-
if (itemOfIndex) {
|
|
125
|
-
|
|
143
|
+
if (!itemOfIndex) {
|
|
144
|
+
return;
|
|
126
145
|
}
|
|
146
|
+
this.ScrollContainer.scrollLeft = itemOfIndex.start;
|
|
127
147
|
}
|
|
128
148
|
async reCalculatorViewPort() {
|
|
129
149
|
let width = 0;
|
|
130
|
-
this.storeItems
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
});
|
|
150
|
+
const items = this.storeItems();
|
|
151
|
+
for (const item of items) {
|
|
152
|
+
const itemWidth = await this.functionGetWidthItem()(item.ref);
|
|
153
|
+
item.itemWidth = itemWidth;
|
|
154
|
+
item.start = width;
|
|
155
|
+
width += itemWidth;
|
|
156
|
+
item.end = width;
|
|
157
|
+
}
|
|
158
|
+
this.storeItems.set([...items]);
|
|
140
159
|
this.divVirtual.style.width = `${width}px`;
|
|
141
160
|
this.handlerScroll();
|
|
142
161
|
}
|
|
143
|
-
ngOnDestroy() {
|
|
144
|
-
this.divVirtual.remove();
|
|
145
|
-
this.onDestroy.next();
|
|
146
|
-
this.onDestroy.complete();
|
|
147
|
-
}
|
|
148
162
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiScrollMeasureItemDirectionHorizontalDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
149
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiScrollMeasureItemDirectionHorizontalDirective, isStandalone: true, selector: "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", inputs: { elementScroll: { classPropertyName: "elementScroll", publicName: "elementScroll", isSignal: true, isRequired: true, transformFunction: null }, functionGetWidthItem: { classPropertyName: "functionGetWidthItem", publicName: "functionGetWidthItem", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { outViewPortItem: "outViewPortItem", outFunctionControl: "outFunctionControl", outDivVirtual: "outDivVirtual" }, ngImport: i0 });
|
|
163
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiScrollMeasureItemDirectionHorizontalDirective, isStandalone: true, selector: "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", inputs: { elementScroll: { classPropertyName: "elementScroll", publicName: "elementScroll", isSignal: true, isRequired: true, transformFunction: null }, functionGetWidthItem: { classPropertyName: "functionGetWidthItem", publicName: "functionGetWidthItem", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { outViewPortItem: "outViewPortItem", outFunctionControl: "outFunctionControl", outDivVirtual: "outDivVirtual", outPaddingLeft: "outPaddingLeft" }, ngImport: i0 });
|
|
150
164
|
}
|
|
151
165
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiScrollMeasureItemDirectionHorizontalDirective, decorators: [{
|
|
152
166
|
type: Directive,
|
|
@@ -156,4 +170,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
156
170
|
standalone: true,
|
|
157
171
|
}]
|
|
158
172
|
}], ctorParameters: () => [] });
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLWhvcml6b250YWwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1tZWFzdXJlLWl0ZW1zL2RpcmVjdGlvbi1ob3Jpem9udGFsL3NyYy9kaXJlY3Rpb24taG9yaXpvbnRhbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBYSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFPckQsTUFBTSxPQUFPLG1EQUFtRDtJQUM5RCxtQkFBbUI7SUFDWixhQUFhLEdBQUcsTUFBTSxDQUE2QixFQUFFLENBQUMsQ0FBQztJQUN0RCxLQUFLLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsR0FBRyxNQUFNLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsVUFBVSxHQUFHLE1BQU0sQ0FBNkIsRUFBRSxDQUFDLENBQUM7SUFDcEQsVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFeEMsZ0JBQWdCO0lBQ1AsYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWUsQ0FBQztJQUM5QyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFrQyxDQUFDO0lBQ3hFLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFjLENBQUM7SUFFOUMsaUJB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L0QsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSx1REFBdUQ7b0JBQ2pFLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNsb25lRGVlcCwgc2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgU3ViamVjdCwgZnJvbUV2ZW50LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxGdW5jdGlvbnNDb250cm9sIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RpcmVjdGlvbi1ob3Jpem9udGFsLmludGVyZmFjZSc7XG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbTGlic1VpU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRGlyZWN0aXZlXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaVNjcm9sbE1lYXN1cmVJdGVtRGlyZWN0aW9uSG9yaXpvbnRhbERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHVibGljIHZpZXdQb3J0SXRlbXMgPSBzaWduYWw8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+KFtdKTtcbiAgcHJpdmF0ZSBzdGFydCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIGVuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHN0b3JlSXRlbXMgPSBzaWduYWw8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+KFtdKTtcbiAgcHJpdmF0ZSBkaXZWaXJ0dWFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGVsZW1lbnRTY3JvbGwgPSBpbnB1dC5yZXF1aXJlZDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgZnVuY3Rpb25HZXRXaWR0aEl0ZW0gPSBpbnB1dC5yZXF1aXJlZDwoaXRlbTogYW55KSA9PiBQcm9taXNlPG51bWJlcj4+KCk7XG4gIHJlYWRvbmx5IGl0ZW1zID0gaW5wdXQucmVxdWlyZWQ8QXJyYXk8YW55Pj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRWaWV3UG9ydEl0ZW0gPSBvdXRwdXQ8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRnVuY3Rpb25zQ29udHJvbD4oKTtcbiAgcmVhZG9ubHkgb3V0RGl2VmlydHVhbCA9IG91dHB1dDxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAvLyAjcmVnaW9uIElOSkVDVFxuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdW50cmFja2VkKCgpID0+IHRoaXMuRWxlbWVudFNjcm9sbCkgfHwgIXVudHJhY2tlZCgoKSA9PiB0aGlzLmZ1bmN0aW9uR2V0V2lkdGhJdGVtKCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcygpO1xuICAgICAgdW50cmFja2VkKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5zdGFydC5zZXQoMCk7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLkVsZW1lbnRTY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gaXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSBjbG9uZURlZXAoaXRlbSk7XG4gICAgICAgICAgbmV3SXRlbS5yZWYgPSBpdGVtO1xuICAgICAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IGF3YWl0IHRoaXMuZnVuY3Rpb25HZXRXaWR0aEl0ZW0oKShpdGVtKTtcbiAgICAgICAgICBuZXdJdGVtLml0ZW1XaWR0aCA9IGl0ZW1XaWR0aDtcbiAgICAgICAgICBuZXdJdGVtLnN0YXJ0ID0gd2lkdGg7XG4gICAgICAgICAgd2lkdGggKz0gaXRlbVdpZHRoO1xuICAgICAgICAgIG5ld0l0ZW0uZW5kID0gd2lkdGg7XG4gICAgICAgICAgaWYgKG5ld0l0ZW0uZW5kIDw9IHJlY3Qud2lkdGggKyB0aGlzLkVsZW1lbnRTY3JvbGwuc2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgdGhpcy5lbmQuc2V0KCtpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0l0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZUl0ZW1zLnNldChuZXdJdGVtcyk7XG4gICAgICAgIHRoaXMudmlld1BvcnRJdGVtcy5zZXQoXG4gICAgICAgICAgdGhpcy5zdG9yZUl0ZW1zKClcbiAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0KCksIHRoaXMuZW5kKCkgKyAzKVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbVsncmVmJ10pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3V0Vmlld1BvcnRJdGVtLmVtaXQodGhpcy52aWV3UG9ydEl0ZW1zKCkpO1xuXG4gICAgICAgIHRoaXMuZGl2VmlydHVhbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuZGl2VmlydHVhbC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgdGhpcy5kaXZWaXJ0dWFsLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZWxhdGl2ZScpO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd3LWZ1bGwnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSBgMHB4YDtcbiAgICAgICAgdGhpcy5FbGVtZW50U2Nyb2xsLmFwcGVuZCh0aGlzLmRpdlZpcnR1YWwpO1xuICAgICAgICB0aGlzLm91dERpdlZpcnR1YWwuZW1pdCh0aGlzLmRpdlZpcnR1YWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuRWxlbWVudFNjcm9sbCwgJ3Njcm9sbCcpLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKHRoaXMuaGFuZGxlclNjcm9sbC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IEVsZW1lbnRTY3JvbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFNjcm9sbCgpIHx8IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRnVuY3Rpb25zQ29udHJvbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbEludG86IHRoaXMuc2Nyb2xsSW50by5iaW5kKHRoaXMpLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbjogdGhpcy5zY3JvbGxUb1Bvc2l0aW9uLmJpbmQodGhpcyksXG4gICAgICBzY3JvbGxUb0luZGV4OiB0aGlzLnNjcm9sbFRvSW5kZXguYmluZCh0aGlzKSxcbiAgICAgIHJlQ2FsY3VsYXRvclZpZXdQb3J0OiB0aGlzLnJlQ2FsY3VsYXRvclZpZXdQb3J0LmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZXJTY3JvbGwoKSB7XG4gICAgaWYgKCF0aGlzLnN0b3JlSXRlbXMoKT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLkVsZW1lbnRTY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydCgpO1xuICAgIGxldCBpc1NldFN0YXJ0UG9zaXRpb25lZCA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBpbiB0aGlzLnN0b3JlSXRlbXMoKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc3RvcmVJdGVtcygpW2luZGV4XTtcbiAgICAgIGlmIChpdGVtWydlbmQnXSA+IHJlY3Qud2lkdGggKyB0aGlzLkVsZW1lbnRTY3JvbGwuc2Nyb2xsTGVmdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZW5kLnNldCgraW5kZXgpO1xuICAgICAgaWYgKGl0ZW1bJ2VuZCddID49IHRoaXMuRWxlbWVudFNjcm9sbC5zY3JvbGxMZWZ0ICYmICFpc1NldFN0YXJ0UG9zaXRpb25lZCkge1xuICAgICAgICBzdGFydCA9ICtpbmRleDtcbiAgICAgICAgaXNTZXRTdGFydFBvc2l0aW9uZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFydCAhPT0gdGhpcy5zdGFydCgpKSB7XG4gICAgICB0aGlzLnN0YXJ0LnNldChzdGFydCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9IGAke3RoaXMuc3RvcmVJdGVtcygpW3N0YXJ0XVsnc3RhcnQnXX1weGA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQoKSA8IDApIHtcbiAgICAgIHRoaXMuc3RhcnQuc2V0KDApO1xuICAgIH1cbiAgICB0aGlzLnZpZXdQb3J0SXRlbXMuc2V0KFxuICAgICAgdGhpcy5zdG9yZUl0ZW1zKClcbiAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnQoKSwgdGhpcy5lbmQoKSArIDMpXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW1bJ3JlZiddKVxuICAgICk7XG4gICAgdGhpcy5vdXRWaWV3UG9ydEl0ZW0uZW1pdCh0aGlzLnZpZXdQb3J0SXRlbXMoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNjcm9sbEludG8oaXRlbVNjcm9sbDogYW55KSB7XG4gICAgY29uc3QgaXRlbUZvdW5kID0gdGhpcy5zdG9yZUl0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbVsncmVmJ10gPT09IGl0ZW1TY3JvbGwpO1xuXG4gICAgaWYgKGl0ZW1Gb3VuZCkge1xuICAgICAgdGhpcy5FbGVtZW50U2Nyb2xsLnNjcm9sbExlZnQgPSBpdGVtRm91bmRbJ3N0YXJ0J107XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYXN5bmMgc2Nyb2xsVG9Qb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgdGhpcy5FbGVtZW50U2Nyb2xsLnNjcm9sbExlZnQgPSBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2Nyb2xsVG9JbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgaXRlbU9mSW5kZXggPSB0aGlzLnN0b3JlSXRlbXMoKVtpbmRleF07XG5cbiAgICBpZiAoaXRlbU9mSW5kZXgpIHtcbiAgICAgIHRoaXMuRWxlbWVudFNjcm9sbC5zY3JvbGxMZWZ0ID0gaXRlbU9mSW5kZXhbJ3N0YXJ0J107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZUNhbGN1bGF0b3JWaWV3UG9ydCgpIHtcbiAgICBsZXQgd2lkdGggPSAwO1xuXG4gICAgdGhpcy5zdG9yZUl0ZW1zLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgIGl0ZW1zLmZvckVhY2goYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgaXRlbVdpZHRoID0gYXdhaXQgdGhpcy5mdW5jdGlvbkdldFdpZHRoSXRlbSgpKGl0ZW1bJ3JlZiddKTtcblxuICAgICAgICBzZXQoaXRlbSwgJ2l0ZW1XaWR0aCcsIGl0ZW1XaWR0aCk7XG4gICAgICAgIHNldChpdGVtLCAnc3RhcnQnLCB3aWR0aCk7XG4gICAgICAgIHdpZHRoICs9IGl0ZW1XaWR0aDtcbiAgICAgICAgc2V0KGl0ZW0sICdlbmQnLCB3aWR0aCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgIH0pO1xuICAgIHRoaXMuZGl2VmlydHVhbC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICB0aGlzLmhhbmRsZXJTY3JvbGwoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGl2VmlydHVhbC5yZW1vdmUoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLWhvcml6b250YWwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1tZWFzdXJlLWl0ZW1zL2RpcmVjdGlvbi1ob3Jpem9udGFsL3NyYy9kaXJlY3Rpb24taG9yaXpvbnRhbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUZBQXlGO0FBQ3pGLHVEQUF1RDtBQUN2RCxPQUFPLEVBQWlCLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25JLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQU9qQyxNQUFNLE9BQU8sbURBQW1EO0lBQzlELG1CQUFtQjtJQUNYLGFBQWEsR0FBRyxNQUFNLENBQWEsRUFBRSxDQUFDLENBQUM7SUFDdkMsS0FBSyxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUMxQixHQUFHLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLFVBQVUsR0FBRyxNQUFNLENBQXdDLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRW5ELGdCQUFnQjtJQUNQLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7SUFDOUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBa0MsQ0FBQztJQUN4RSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBYyxDQUFDO0lBRTlDLGlC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LENBQUMsQ0FBQztRQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVoQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLEtBQUssSUFBSSxTQUFTLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO3dHQWhMVSxtREFBbUQ7NEZBQW5ELG1EQUFtRDs7NEZBQW5ELG1EQUFtRDtrQkFML0QsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSx1REFBdUQ7b0JBQ2pFLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENPTlZFTlRJT04tRVhDRVBUOiBhbnkg4oCUIEdlbmVyaWMgZGlyZWN0aXZlIHdvcmtzIHdpdGggdW5rbm93biBpdGVtIHR5cGVzIGZyb20gY29uc3VtZXJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxGdW5jdGlvbnNDb250cm9sLCBJU2Nyb2xsTWVhc3VyZVN0b3JlSXRlbUNvbnZlcnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZGlyZWN0aW9uLWhvcml6b250YWwuaW50ZXJmYWNlJztcbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxEaXJlY3RpdmVdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSB2aWV3UG9ydEl0ZW1zID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJpdmF0ZSBzdGFydCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIGVuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHN0b3JlSXRlbXMgPSBzaWduYWw8QXJyYXk8SVNjcm9sbE1lYXN1cmVTdG9yZUl0ZW1Db252ZXJ0Pj4oW10pO1xuICBwcml2YXRlIGRpdlZpcnR1YWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGVsZW1lbnRTY3JvbGwgPSBpbnB1dC5yZXF1aXJlZDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgZnVuY3Rpb25HZXRXaWR0aEl0ZW0gPSBpbnB1dC5yZXF1aXJlZDwoaXRlbTogYW55KSA9PiBQcm9taXNlPG51bWJlcj4+KCk7XG4gIHJlYWRvbmx5IGl0ZW1zID0gaW5wdXQucmVxdWlyZWQ8QXJyYXk8YW55Pj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRWaWV3UG9ydEl0ZW0gPSBvdXRwdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxGdW5jdGlvbnNDb250cm9sPigpO1xuICByZWFkb25seSBvdXREaXZWaXJ0dWFsID0gb3V0cHV0PEhUTUxEaXZFbGVtZW50PigpO1xuICByZWFkb25seSBvdXRQYWRkaW5nTGVmdCA9IG91dHB1dDxudW1iZXI+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbEVsID0gdW50cmFja2VkKCgpID0+IHRoaXMuU2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgIGlmICghc2Nyb2xsRWwgfHwgIXVudHJhY2tlZCgoKSA9PiB0aGlzLmZ1bmN0aW9uR2V0V2lkdGhJdGVtKCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcygpO1xuICAgICAgdW50cmFja2VkKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5zdGFydC5zZXQoMCk7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBzY3JvbGxFbC5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHNjcm9sbEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBjb25zdCBuZXdJdGVtczogQXJyYXk8SVNjcm9sbE1lYXN1cmVTdG9yZUl0ZW1Db252ZXJ0PiA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgY29uc3QgbmV3SXRlbTogSVNjcm9sbE1lYXN1cmVTdG9yZUl0ZW1Db252ZXJ0ID0geyByZWY6IGl0ZW0sIGl0ZW1XaWR0aDogMCwgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IGF3YWl0IHRoaXMuZnVuY3Rpb25HZXRXaWR0aEl0ZW0oKShpdGVtKTtcbiAgICAgICAgICBuZXdJdGVtLml0ZW1XaWR0aCA9IGl0ZW1XaWR0aDtcbiAgICAgICAgICBuZXdJdGVtLnN0YXJ0ID0gd2lkdGg7XG4gICAgICAgICAgd2lkdGggKz0gaXRlbVdpZHRoO1xuICAgICAgICAgIG5ld0l0ZW0uZW5kID0gd2lkdGg7XG4gICAgICAgICAgaWYgKG5ld0l0ZW0uZW5kIDw9IGNvbnRhaW5lcldpZHRoICsgc2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgdGhpcy5lbmQuc2V0KGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdJdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdG9yZUl0ZW1zLnNldChuZXdJdGVtcyk7XG4gICAgICAgIHRoaXMudmlld1BvcnRJdGVtcy5zZXQoXG4gICAgICAgICAgdGhpcy5zdG9yZUl0ZW1zKClcbiAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0KCksIHRoaXMuZW5kKCkgKyAzKVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5yZWYpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3V0Vmlld1BvcnRJdGVtLmVtaXQodGhpcy52aWV3UG9ydEl0ZW1zKCkpO1xuICAgICAgICB0aGlzLm91dFBhZGRpbmdMZWZ0LmVtaXQoZ2V0KHRoaXMuc3RvcmVJdGVtcygpLCBgWyR7dGhpcy5zdGFydCgpfV0uc3RhcnRgLCAwKSk7XG5cbiAgICAgICAgdGhpcy5kaXZWaXJ0dWFsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5kaXZWaXJ0dWFsLnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgICAgICB0aGlzLmRpdlZpcnR1YWwuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgICAgICB0aGlzLmRpdlZpcnR1YWwuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgIHRoaXMuZGl2VmlydHVhbC5zdHlsZS5oZWlnaHQgPSAnMXB4JztcbiAgICAgICAgdGhpcy5kaXZWaXJ0dWFsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVsYXRpdmUnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndy1mdWxsJyk7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJzBweCc7XG4gICAgICAgIHNjcm9sbEVsLmFwcGVuZCh0aGlzLmRpdlZpcnR1YWwpO1xuICAgICAgICB0aGlzLm91dERpdlZpcnR1YWwuZW1pdCh0aGlzLmRpdlZpcnR1YWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIHRoaXMuZGl2VmlydHVhbC5yZW1vdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZyb21FdmVudDxFdmVudD4odGhpcy5TY3JvbGxDb250YWluZXIsICdzY3JvbGwnKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZXJTY3JvbGwoKSk7XG4gICAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAjcmVnaW9uIFBVQkxJQyBBUElcbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxGdW5jdGlvbnNDb250cm9sIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsSW50bzogdGhpcy5zY3JvbGxJbnRvLmJpbmQodGhpcyksXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiB0aGlzLnNjcm9sbFRvUG9zaXRpb24uYmluZCh0aGlzKSxcbiAgICAgIHNjcm9sbFRvSW5kZXg6IHRoaXMuc2Nyb2xsVG9JbmRleC5iaW5kKHRoaXMpLFxuICAgICAgcmVDYWxjdWxhdG9yVmlld1BvcnQ6IHRoaXMucmVDYWxjdWxhdG9yVmlld1BvcnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFZpZXdQb3J0SXRlbXM6ICgpID0+IHRoaXMudmlld1BvcnRJdGVtcygpLFxuICAgIH07XG4gIH1cblxuICAvLyAjcmVnaW9uIFBSSVZBVEUgTUVUSE9EU1xuICBwcml2YXRlIGdldCBTY3JvbGxDb250YWluZXIoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRTY3JvbGwoKSB8fCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNjcm9sbCgpIHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVJdGVtcygpO1xuICAgIGlmICghc3RvcmU/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY3JvbGxFbCA9IHRoaXMuU2Nyb2xsQ29udGFpbmVyO1xuICAgIGNvbnN0IHNjcm9sbExlZnQgPSBzY3JvbGxFbC5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gc2Nyb2xsRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydCgpO1xuICAgIGxldCBpc1NldFN0YXJ0UG9zaXRpb25lZCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdG9yZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHN0b3JlW2ldO1xuICAgICAgaWYgKGl0ZW0uZW5kID4gY29udGFpbmVyV2lkdGggKyBzY3JvbGxMZWZ0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmQuc2V0KGkpO1xuICAgICAgaWYgKGl0ZW0uZW5kID49IHNjcm9sbExlZnQgJiYgIWlzU2V0U3RhcnRQb3NpdGlvbmVkKSB7XG4gICAgICAgIHN0YXJ0ID0gaTtcbiAgICAgICAgaXNTZXRTdGFydFBvc2l0aW9uZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFydCAhPT0gdGhpcy5zdGFydCgpKSB7XG4gICAgICB0aGlzLnN0YXJ0LnNldChzdGFydCk7XG4gICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHN0b3JlW3N0YXJ0XS5zdGFydDtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gYCR7cGFkZGluZ0xlZnR9cHhgO1xuICAgICAgdGhpcy5vdXRQYWRkaW5nTGVmdC5lbWl0KHBhZGRpbmdMZWZ0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFydCgpIDwgMCkge1xuICAgICAgdGhpcy5zdGFydC5zZXQoMCk7XG4gICAgfVxuICAgIHRoaXMudmlld1BvcnRJdGVtcy5zZXQoc3RvcmUuc2xpY2UodGhpcy5zdGFydCgpLCB0aGlzLmVuZCgpICsgMykubWFwKChpdGVtKSA9PiBpdGVtLnJlZikpO1xuICAgIHRoaXMub3V0Vmlld1BvcnRJdGVtLmVtaXQodGhpcy52aWV3UG9ydEl0ZW1zKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzY3JvbGxJbnRvKGl0ZW1TY3JvbGw6IGFueSkge1xuICAgIGNvbnN0IGl0ZW1Gb3VuZCA9IHRoaXMuc3RvcmVJdGVtcygpLmZpbmQoKGl0ZW0pID0+IGl0ZW0ucmVmID09PSBpdGVtU2Nyb2xsKTtcbiAgICBpZiAoIWl0ZW1Gb3VuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLlNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gaXRlbUZvdW5kLnN0YXJ0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICB0aGlzLlNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGl0ZW1PZkluZGV4ID0gdGhpcy5zdG9yZUl0ZW1zKClbaW5kZXhdO1xuICAgIGlmICghaXRlbU9mSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5TY3JvbGxDb250YWluZXIuc2Nyb2xsTGVmdCA9IGl0ZW1PZkluZGV4LnN0YXJ0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZUNhbGN1bGF0b3JWaWV3UG9ydCgpIHtcbiAgICBsZXQgd2lkdGggPSAwO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5zdG9yZUl0ZW1zKCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IGF3YWl0IHRoaXMuZnVuY3Rpb25HZXRXaWR0aEl0ZW0oKShpdGVtLnJlZik7XG4gICAgICBpdGVtLml0ZW1XaWR0aCA9IGl0ZW1XaWR0aDtcbiAgICAgIGl0ZW0uc3RhcnQgPSB3aWR0aDtcbiAgICAgIHdpZHRoICs9IGl0ZW1XaWR0aDtcbiAgICAgIGl0ZW0uZW5kID0gd2lkdGg7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yZUl0ZW1zLnNldChbLi4uaXRlbXNdKTtcbiAgICB0aGlzLmRpdlZpcnR1YWwuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgdGhpcy5oYW5kbGVyU2Nyb2xsKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLWhvcml6b250YWwuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1tZWFzdXJlLWl0ZW1zL2RpcmVjdGlvbi1ob3Jpem9udGFsL3NyYy9pbnRlcmZhY2VzL2RpcmVjdGlvbi1ob3Jpem9udGFsLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRnVuY3Rpb25zQ29udHJvbCB7XG4gIHNjcm9sbEludG86IChpdGVtOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG4gIHNjcm9sbFRvUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzY3JvbGxUb0luZGV4OiAoaW5kZXg6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVDYWxjdWxhdG9yVmlld1BvcnQ6ICgpID0+
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLWhvcml6b250YWwuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1tZWFzdXJlLWl0ZW1zL2RpcmVjdGlvbi1ob3Jpem9udGFsL3NyYy9pbnRlcmZhY2VzL2RpcmVjdGlvbi1ob3Jpem9udGFsLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRnVuY3Rpb25zQ29udHJvbCB7XG4gIHNjcm9sbEludG86IChpdGVtOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG4gIHNjcm9sbFRvUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzY3JvbGxUb0luZGV4OiAoaW5kZXg6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVDYWxjdWxhdG9yVmlld1BvcnQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIGdldFZpZXdQb3J0SXRlbXM6ICgpID0+IEFycmF5PGFueT47XG59XG5leHBvcnQgaW50ZXJmYWNlIElTY3JvbGxNZWFzdXJlU3RvcmVJdGVtQ29udmVydCB7XG4gIHJlZjogYW55O1xuICBpdGVtV2lkdGg6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG59XG4iXX0=
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, input, output, inject, ElementRef, effect, untracked, Directive } from '@angular/core';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { signal, input, output, inject, ElementRef, DestroyRef, effect, untracked, Directive } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { get } from '@libs-ui/utils';
|
|
5
|
+
import { fromEvent } from 'rxjs';
|
|
5
6
|
|
|
7
|
+
// CONVENTION-EXCEPT: any — Generic directive works with unknown item types from consumer
|
|
6
8
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
9
|
class LibsUiScrollMeasureItemDirectionHorizontalDirective {
|
|
8
10
|
// #region PROPERTY
|
|
@@ -11,7 +13,6 @@ class LibsUiScrollMeasureItemDirectionHorizontalDirective {
|
|
|
11
13
|
end = signal(0);
|
|
12
14
|
storeItems = signal([]);
|
|
13
15
|
divVirtual = document.createElement('div');
|
|
14
|
-
onDestroy = new Subject();
|
|
15
16
|
// #region INPUT
|
|
16
17
|
elementScroll = input.required();
|
|
17
18
|
functionGetWidthItem = input.required();
|
|
@@ -20,134 +21,147 @@ class LibsUiScrollMeasureItemDirectionHorizontalDirective {
|
|
|
20
21
|
outViewPortItem = output();
|
|
21
22
|
outFunctionControl = output();
|
|
22
23
|
outDivVirtual = output();
|
|
24
|
+
outPaddingLeft = output();
|
|
23
25
|
// #region INJECT
|
|
24
26
|
elementRef = inject(ElementRef);
|
|
27
|
+
destroyRef = inject(DestroyRef);
|
|
25
28
|
constructor() {
|
|
26
29
|
effect(() => {
|
|
27
|
-
|
|
30
|
+
const scrollEl = untracked(() => this.ScrollContainer);
|
|
31
|
+
if (!scrollEl || !untracked(() => this.functionGetWidthItem())) {
|
|
28
32
|
return;
|
|
29
33
|
}
|
|
30
34
|
const items = this.items();
|
|
31
35
|
untracked(async () => {
|
|
32
36
|
this.start.set(0);
|
|
33
|
-
const
|
|
37
|
+
const scrollLeft = scrollEl.scrollLeft;
|
|
38
|
+
const containerWidth = scrollEl.getBoundingClientRect().width;
|
|
34
39
|
let width = 0;
|
|
35
40
|
const newItems = [];
|
|
36
|
-
for (
|
|
37
|
-
const item = items[
|
|
38
|
-
const newItem =
|
|
39
|
-
newItem.ref = item;
|
|
41
|
+
for (let i = 0; i < items.length; i++) {
|
|
42
|
+
const item = items[i];
|
|
43
|
+
const newItem = { ref: item, itemWidth: 0, start: 0, end: 0 };
|
|
40
44
|
const itemWidth = await this.functionGetWidthItem()(item);
|
|
41
45
|
newItem.itemWidth = itemWidth;
|
|
42
46
|
newItem.start = width;
|
|
43
47
|
width += itemWidth;
|
|
44
48
|
newItem.end = width;
|
|
45
|
-
if (newItem.end <=
|
|
46
|
-
this.end.set(
|
|
49
|
+
if (newItem.end <= containerWidth + scrollLeft) {
|
|
50
|
+
this.end.set(i);
|
|
47
51
|
}
|
|
48
52
|
newItems.push(newItem);
|
|
49
53
|
}
|
|
50
54
|
this.storeItems.set(newItems);
|
|
51
55
|
this.viewPortItems.set(this.storeItems()
|
|
52
56
|
.slice(this.start(), this.end() + 3)
|
|
53
|
-
.map((item) => item
|
|
57
|
+
.map((item) => item.ref));
|
|
54
58
|
this.outViewPortItem.emit(this.viewPortItems());
|
|
59
|
+
this.outPaddingLeft.emit(get(this.storeItems(), `[${this.start()}].start`, 0));
|
|
55
60
|
this.divVirtual.style.position = 'absolute';
|
|
61
|
+
this.divVirtual.style.top = '0px';
|
|
62
|
+
this.divVirtual.style.left = '0px';
|
|
56
63
|
this.divVirtual.style.width = `${width}px`;
|
|
57
64
|
this.divVirtual.style.height = '1px';
|
|
65
|
+
this.divVirtual.style.visibility = 'hidden';
|
|
58
66
|
this.elementRef.nativeElement.classList.add('relative');
|
|
59
67
|
this.elementRef.nativeElement.classList.remove('w-full');
|
|
60
|
-
this.elementRef.nativeElement.style.paddingLeft =
|
|
61
|
-
|
|
68
|
+
this.elementRef.nativeElement.style.paddingLeft = '0px';
|
|
69
|
+
scrollEl.append(this.divVirtual);
|
|
62
70
|
this.outDivVirtual.emit(this.divVirtual);
|
|
63
71
|
});
|
|
64
72
|
});
|
|
73
|
+
this.destroyRef.onDestroy(() => {
|
|
74
|
+
this.divVirtual.remove();
|
|
75
|
+
});
|
|
65
76
|
}
|
|
66
77
|
ngAfterViewInit() {
|
|
67
78
|
setTimeout(() => {
|
|
68
|
-
fromEvent(this.
|
|
79
|
+
fromEvent(this.ScrollContainer, 'scroll')
|
|
80
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
81
|
+
.subscribe(() => this.handlerScroll());
|
|
69
82
|
this.outFunctionControl.emit(this.FunctionsControl);
|
|
70
83
|
});
|
|
71
84
|
}
|
|
72
|
-
|
|
73
|
-
return this.elementScroll() || this.elementRef.nativeElement;
|
|
74
|
-
}
|
|
75
|
-
/* FUNCTIONS */
|
|
85
|
+
// #region PUBLIC API
|
|
76
86
|
get FunctionsControl() {
|
|
77
87
|
return {
|
|
78
88
|
scrollInto: this.scrollInto.bind(this),
|
|
79
89
|
scrollToPosition: this.scrollToPosition.bind(this),
|
|
80
90
|
scrollToIndex: this.scrollToIndex.bind(this),
|
|
81
91
|
reCalculatorViewPort: this.reCalculatorViewPort.bind(this),
|
|
92
|
+
getViewPortItems: () => this.viewPortItems(),
|
|
82
93
|
};
|
|
83
94
|
}
|
|
95
|
+
// #region PRIVATE METHODS
|
|
96
|
+
get ScrollContainer() {
|
|
97
|
+
return this.elementScroll() || this.elementRef.nativeElement;
|
|
98
|
+
}
|
|
84
99
|
handlerScroll() {
|
|
85
|
-
|
|
100
|
+
const store = this.storeItems();
|
|
101
|
+
if (!store?.length) {
|
|
86
102
|
return;
|
|
87
103
|
}
|
|
88
|
-
const
|
|
104
|
+
const scrollEl = this.ScrollContainer;
|
|
105
|
+
const scrollLeft = scrollEl.scrollLeft;
|
|
106
|
+
const containerWidth = scrollEl.getBoundingClientRect().width;
|
|
89
107
|
let start = this.start();
|
|
90
108
|
let isSetStartPositioned = false;
|
|
91
|
-
for (
|
|
92
|
-
const item =
|
|
93
|
-
if (item
|
|
109
|
+
for (let i = 0; i < store.length; i++) {
|
|
110
|
+
const item = store[i];
|
|
111
|
+
if (item.end > containerWidth + scrollLeft) {
|
|
94
112
|
break;
|
|
95
113
|
}
|
|
96
|
-
this.end.set(
|
|
97
|
-
if (item
|
|
98
|
-
start =
|
|
114
|
+
this.end.set(i);
|
|
115
|
+
if (item.end >= scrollLeft && !isSetStartPositioned) {
|
|
116
|
+
start = i;
|
|
99
117
|
isSetStartPositioned = true;
|
|
100
118
|
}
|
|
101
119
|
}
|
|
102
120
|
if (start !== this.start()) {
|
|
103
121
|
this.start.set(start);
|
|
104
|
-
|
|
122
|
+
const paddingLeft = store[start].start;
|
|
123
|
+
this.elementRef.nativeElement.style.paddingLeft = `${paddingLeft}px`;
|
|
124
|
+
this.outPaddingLeft.emit(paddingLeft);
|
|
105
125
|
}
|
|
106
126
|
if (this.start() < 0) {
|
|
107
127
|
this.start.set(0);
|
|
108
128
|
}
|
|
109
|
-
this.viewPortItems.set(this.
|
|
110
|
-
.slice(this.start(), this.end() + 3)
|
|
111
|
-
.map((item) => item['ref']));
|
|
129
|
+
this.viewPortItems.set(store.slice(this.start(), this.end() + 3).map((item) => item.ref));
|
|
112
130
|
this.outViewPortItem.emit(this.viewPortItems());
|
|
113
131
|
}
|
|
114
132
|
async scrollInto(itemScroll) {
|
|
115
|
-
const itemFound = this.storeItems().find((item) => item
|
|
116
|
-
if (itemFound) {
|
|
117
|
-
|
|
133
|
+
const itemFound = this.storeItems().find((item) => item.ref === itemScroll);
|
|
134
|
+
if (!itemFound) {
|
|
135
|
+
return;
|
|
118
136
|
}
|
|
137
|
+
this.ScrollContainer.scrollLeft = itemFound.start;
|
|
119
138
|
}
|
|
120
139
|
async scrollToPosition(position) {
|
|
121
|
-
this.
|
|
140
|
+
this.ScrollContainer.scrollLeft = position;
|
|
122
141
|
}
|
|
123
142
|
async scrollToIndex(index) {
|
|
124
143
|
const itemOfIndex = this.storeItems()[index];
|
|
125
|
-
if (itemOfIndex) {
|
|
126
|
-
|
|
144
|
+
if (!itemOfIndex) {
|
|
145
|
+
return;
|
|
127
146
|
}
|
|
147
|
+
this.ScrollContainer.scrollLeft = itemOfIndex.start;
|
|
128
148
|
}
|
|
129
149
|
async reCalculatorViewPort() {
|
|
130
150
|
let width = 0;
|
|
131
|
-
this.storeItems
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
});
|
|
151
|
+
const items = this.storeItems();
|
|
152
|
+
for (const item of items) {
|
|
153
|
+
const itemWidth = await this.functionGetWidthItem()(item.ref);
|
|
154
|
+
item.itemWidth = itemWidth;
|
|
155
|
+
item.start = width;
|
|
156
|
+
width += itemWidth;
|
|
157
|
+
item.end = width;
|
|
158
|
+
}
|
|
159
|
+
this.storeItems.set([...items]);
|
|
141
160
|
this.divVirtual.style.width = `${width}px`;
|
|
142
161
|
this.handlerScroll();
|
|
143
162
|
}
|
|
144
|
-
ngOnDestroy() {
|
|
145
|
-
this.divVirtual.remove();
|
|
146
|
-
this.onDestroy.next();
|
|
147
|
-
this.onDestroy.complete();
|
|
148
|
-
}
|
|
149
163
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiScrollMeasureItemDirectionHorizontalDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
150
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiScrollMeasureItemDirectionHorizontalDirective, isStandalone: true, selector: "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", inputs: { elementScroll: { classPropertyName: "elementScroll", publicName: "elementScroll", isSignal: true, isRequired: true, transformFunction: null }, functionGetWidthItem: { classPropertyName: "functionGetWidthItem", publicName: "functionGetWidthItem", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { outViewPortItem: "outViewPortItem", outFunctionControl: "outFunctionControl", outDivVirtual: "outDivVirtual" }, ngImport: i0 });
|
|
164
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiScrollMeasureItemDirectionHorizontalDirective, isStandalone: true, selector: "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", inputs: { elementScroll: { classPropertyName: "elementScroll", publicName: "elementScroll", isSignal: true, isRequired: true, transformFunction: null }, functionGetWidthItem: { classPropertyName: "functionGetWidthItem", publicName: "functionGetWidthItem", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { outViewPortItem: "outViewPortItem", outFunctionControl: "outFunctionControl", outDivVirtual: "outDivVirtual", outPaddingLeft: "outPaddingLeft" }, ngImport: i0 });
|
|
151
165
|
}
|
|
152
166
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiScrollMeasureItemDirectionHorizontalDirective, decorators: [{
|
|
153
167
|
type: Directive,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-scroll-measure-items-direction-horizontal.mjs","sources":["../../../../../../libs-ui/components/scroll-measure-items/direction-horizontal/src/direction-horizontal.directive.ts","../../../../../../libs-ui/components/scroll-measure-items/direction-horizontal/src/libs-ui-components-scroll-measure-items-direction-horizontal.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterViewInit, Directive, ElementRef, OnDestroy, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { cloneDeep, set } from '@libs-ui/utils';\nimport { Subject, fromEvent, takeUntil } from 'rxjs';\nimport { IScrollMeasureItemDirectionHorizontalFunctionsControl } from './interfaces/direction-horizontal.interface';\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiScrollMeasureItemDirectionHorizontalDirective]',\n standalone: true,\n})\nexport class LibsUiScrollMeasureItemDirectionHorizontalDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n public viewPortItems = signal<Array<Record<string, any>>>([]);\n private start = signal<number>(0);\n private end = signal<number>(0);\n private storeItems = signal<Array<Record<string, any>>>([]);\n private divVirtual = document.createElement('div');\n private onDestroy = new Subject<void>();\n\n // #region INPUT\n readonly elementScroll = input.required<HTMLElement>();\n readonly functionGetWidthItem = input.required<(item: any) => Promise<number>>();\n readonly items = input.required<Array<any>>();\n\n // #region OUTPUT\n readonly outViewPortItem = output<Array<Record<string, any>>>();\n readonly outFunctionControl = output<IScrollMeasureItemDirectionHorizontalFunctionsControl>();\n readonly outDivVirtual = output<HTMLDivElement>();\n\n // #region INJECT\n private elementRef = inject(ElementRef);\n\n constructor() {\n effect(() => {\n if (!untracked(() => this.ElementScroll) || !untracked(() => this.functionGetWidthItem())) {\n return;\n }\n const items = this.items();\n untracked(async () => {\n this.start.set(0);\n const rect = this.ElementScroll.getBoundingClientRect();\n let width = 0;\n const newItems = [];\n for (const index in items) {\n const item = items[index];\n const newItem = cloneDeep(item);\n newItem.ref = item;\n const itemWidth = await this.functionGetWidthItem()(item);\n newItem.itemWidth = itemWidth;\n newItem.start = width;\n width += itemWidth;\n newItem.end = width;\n if (newItem.end <= rect.width + this.ElementScroll.scrollLeft) {\n this.end.set(+index);\n }\n newItems.push(newItem);\n }\n this.storeItems.set(newItems);\n this.viewPortItems.set(\n this.storeItems()\n .slice(this.start(), this.end() + 3)\n .map((item) => item['ref'])\n );\n this.outViewPortItem.emit(this.viewPortItems());\n\n this.divVirtual.style.position = 'absolute';\n this.divVirtual.style.width = `${width}px`;\n this.divVirtual.style.height = '1px';\n this.elementRef.nativeElement.classList.add('relative');\n this.elementRef.nativeElement.classList.remove('w-full');\n this.elementRef.nativeElement.style.paddingLeft = `0px`;\n this.ElementScroll.append(this.divVirtual);\n this.outDivVirtual.emit(this.divVirtual);\n });\n });\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n fromEvent<Event>(this.ElementScroll, 'scroll').pipe(takeUntil(this.onDestroy)).subscribe(this.handlerScroll.bind(this));\n this.outFunctionControl.emit(this.FunctionsControl);\n });\n }\n\n private get ElementScroll() {\n return this.elementScroll() || this.elementRef.nativeElement;\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): IScrollMeasureItemDirectionHorizontalFunctionsControl {\n return {\n scrollInto: this.scrollInto.bind(this),\n scrollToPosition: this.scrollToPosition.bind(this),\n scrollToIndex: this.scrollToIndex.bind(this),\n reCalculatorViewPort: this.reCalculatorViewPort.bind(this),\n };\n }\n private handlerScroll() {\n if (!this.storeItems()?.length) {\n return;\n }\n const rect = this.ElementScroll.getBoundingClientRect();\n let start = this.start();\n let isSetStartPositioned = false;\n\n for (const index in this.storeItems()) {\n const item = this.storeItems()[index];\n if (item['end'] > rect.width + this.ElementScroll.scrollLeft) {\n break;\n }\n this.end.set(+index);\n if (item['end'] >= this.ElementScroll.scrollLeft && !isSetStartPositioned) {\n start = +index;\n isSetStartPositioned = true;\n }\n }\n\n if (start !== this.start()) {\n this.start.set(start);\n this.elementRef.nativeElement.style.paddingLeft = `${this.storeItems()[start]['start']}px`;\n }\n\n if (this.start() < 0) {\n this.start.set(0);\n }\n this.viewPortItems.set(\n this.storeItems()\n .slice(this.start(), this.end() + 3)\n .map((item) => item['ref'])\n );\n this.outViewPortItem.emit(this.viewPortItems());\n }\n\n private async scrollInto(itemScroll: any) {\n const itemFound = this.storeItems().find((item) => item['ref'] === itemScroll);\n\n if (itemFound) {\n this.ElementScroll.scrollLeft = itemFound['start'];\n }\n }\n private async scrollToPosition(position: number) {\n this.ElementScroll.scrollLeft = position;\n }\n\n private async scrollToIndex(index: number) {\n const itemOfIndex = this.storeItems()[index];\n\n if (itemOfIndex) {\n this.ElementScroll.scrollLeft = itemOfIndex['start'];\n }\n }\n\n private async reCalculatorViewPort() {\n let width = 0;\n\n this.storeItems.update((items) => {\n items.forEach(async (item) => {\n const itemWidth = await this.functionGetWidthItem()(item['ref']);\n\n set(item, 'itemWidth', itemWidth);\n set(item, 'start', width);\n width += itemWidth;\n set(item, 'end', width);\n });\n return [...items];\n });\n this.divVirtual.style.width = `${width}px`;\n this.handlerScroll();\n }\n\n ngOnDestroy(): void {\n this.divVirtual.remove();\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-scroll-measure-items-direction-horizontal.mjs","sources":["../../../../../../libs-ui/components/scroll-measure-items/direction-horizontal/src/direction-horizontal.directive.ts","../../../../../../libs-ui/components/scroll-measure-items/direction-horizontal/src/libs-ui-components-scroll-measure-items-direction-horizontal.ts"],"sourcesContent":["// CONVENTION-EXCEPT: any — Generic directive works with unknown item types from consumer\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterViewInit, DestroyRef, Directive, ElementRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { get } from '@libs-ui/utils';\nimport { fromEvent } from 'rxjs';\nimport { IScrollMeasureItemDirectionHorizontalFunctionsControl, IScrollMeasureStoreItemConvert } from './interfaces/direction-horizontal.interface';\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiScrollMeasureItemDirectionHorizontalDirective]',\n standalone: true,\n})\nexport class LibsUiScrollMeasureItemDirectionHorizontalDirective implements AfterViewInit {\n // #region PROPERTY\n private viewPortItems = signal<Array<any>>([]);\n private start = signal<number>(0);\n private end = signal<number>(0);\n private storeItems = signal<Array<IScrollMeasureStoreItemConvert>>([]);\n private divVirtual = document.createElement('div');\n\n // #region INPUT\n readonly elementScroll = input.required<HTMLElement>();\n readonly functionGetWidthItem = input.required<(item: any) => Promise<number>>();\n readonly items = input.required<Array<any>>();\n\n // #region OUTPUT\n readonly outViewPortItem = output<Array<any>>();\n readonly outFunctionControl = output<IScrollMeasureItemDirectionHorizontalFunctionsControl>();\n readonly outDivVirtual = output<HTMLDivElement>();\n readonly outPaddingLeft = output<number>();\n\n // #region INJECT\n private readonly elementRef = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n effect(() => {\n const scrollEl = untracked(() => this.ScrollContainer);\n if (!scrollEl || !untracked(() => this.functionGetWidthItem())) {\n return;\n }\n const items = this.items();\n untracked(async () => {\n this.start.set(0);\n const scrollLeft = scrollEl.scrollLeft;\n const containerWidth = scrollEl.getBoundingClientRect().width;\n let width = 0;\n const newItems: Array<IScrollMeasureStoreItemConvert> = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const newItem: IScrollMeasureStoreItemConvert = { ref: item, itemWidth: 0, start: 0, end: 0 };\n const itemWidth = await this.functionGetWidthItem()(item);\n newItem.itemWidth = itemWidth;\n newItem.start = width;\n width += itemWidth;\n newItem.end = width;\n if (newItem.end <= containerWidth + scrollLeft) {\n this.end.set(i);\n }\n newItems.push(newItem);\n }\n\n this.storeItems.set(newItems);\n this.viewPortItems.set(\n this.storeItems()\n .slice(this.start(), this.end() + 3)\n .map((item) => item.ref)\n );\n this.outViewPortItem.emit(this.viewPortItems());\n this.outPaddingLeft.emit(get(this.storeItems(), `[${this.start()}].start`, 0));\n\n this.divVirtual.style.position = 'absolute';\n this.divVirtual.style.top = '0px';\n this.divVirtual.style.left = '0px';\n this.divVirtual.style.width = `${width}px`;\n this.divVirtual.style.height = '1px';\n this.divVirtual.style.visibility = 'hidden';\n this.elementRef.nativeElement.classList.add('relative');\n this.elementRef.nativeElement.classList.remove('w-full');\n this.elementRef.nativeElement.style.paddingLeft = '0px';\n scrollEl.append(this.divVirtual);\n this.outDivVirtual.emit(this.divVirtual);\n });\n });\n\n this.destroyRef.onDestroy(() => {\n this.divVirtual.remove();\n });\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n fromEvent<Event>(this.ScrollContainer, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.handlerScroll());\n this.outFunctionControl.emit(this.FunctionsControl);\n });\n }\n\n // #region PUBLIC API\n public get FunctionsControl(): IScrollMeasureItemDirectionHorizontalFunctionsControl {\n return {\n scrollInto: this.scrollInto.bind(this),\n scrollToPosition: this.scrollToPosition.bind(this),\n scrollToIndex: this.scrollToIndex.bind(this),\n reCalculatorViewPort: this.reCalculatorViewPort.bind(this),\n getViewPortItems: () => this.viewPortItems(),\n };\n }\n\n // #region PRIVATE METHODS\n private get ScrollContainer(): HTMLElement {\n return this.elementScroll() || this.elementRef.nativeElement;\n }\n\n private handlerScroll() {\n const store = this.storeItems();\n if (!store?.length) {\n return;\n }\n const scrollEl = this.ScrollContainer;\n const scrollLeft = scrollEl.scrollLeft;\n const containerWidth = scrollEl.getBoundingClientRect().width;\n let start = this.start();\n let isSetStartPositioned = false;\n\n for (let i = 0; i < store.length; i++) {\n const item = store[i];\n if (item.end > containerWidth + scrollLeft) {\n break;\n }\n this.end.set(i);\n if (item.end >= scrollLeft && !isSetStartPositioned) {\n start = i;\n isSetStartPositioned = true;\n }\n }\n\n if (start !== this.start()) {\n this.start.set(start);\n const paddingLeft = store[start].start;\n this.elementRef.nativeElement.style.paddingLeft = `${paddingLeft}px`;\n this.outPaddingLeft.emit(paddingLeft);\n }\n\n if (this.start() < 0) {\n this.start.set(0);\n }\n this.viewPortItems.set(store.slice(this.start(), this.end() + 3).map((item) => item.ref));\n this.outViewPortItem.emit(this.viewPortItems());\n }\n\n private async scrollInto(itemScroll: any) {\n const itemFound = this.storeItems().find((item) => item.ref === itemScroll);\n if (!itemFound) {\n return;\n }\n this.ScrollContainer.scrollLeft = itemFound.start;\n }\n\n private async scrollToPosition(position: number) {\n this.ScrollContainer.scrollLeft = position;\n }\n\n private async scrollToIndex(index: number) {\n const itemOfIndex = this.storeItems()[index];\n if (!itemOfIndex) {\n return;\n }\n this.ScrollContainer.scrollLeft = itemOfIndex.start;\n }\n\n private async reCalculatorViewPort() {\n let width = 0;\n const items = this.storeItems();\n\n for (const item of items) {\n const itemWidth = await this.functionGetWidthItem()(item.ref);\n item.itemWidth = itemWidth;\n item.start = width;\n width += itemWidth;\n item.end = width;\n }\n\n this.storeItems.set([...items]);\n this.divVirtual.style.width = `${width}px`;\n this.handlerScroll();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,4 +3,11 @@ export interface IScrollMeasureItemDirectionHorizontalFunctionsControl {
|
|
|
3
3
|
scrollToPosition: (position: number) => Promise<void>;
|
|
4
4
|
scrollToIndex: (index: number) => Promise<void>;
|
|
5
5
|
reCalculatorViewPort: () => Promise<void>;
|
|
6
|
+
getViewPortItems: () => Array<any>;
|
|
7
|
+
}
|
|
8
|
+
export interface IScrollMeasureStoreItemConvert {
|
|
9
|
+
ref: any;
|
|
10
|
+
itemWidth: number;
|
|
11
|
+
start: number;
|
|
12
|
+
end: number;
|
|
6
13
|
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-scroll-measure-items-direction-horizontal",
|
|
3
|
-
"version": "0.2.356-
|
|
3
|
+
"version": "0.2.356-21",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/core": ">=18.0.0",
|
|
6
|
-
"@libs-ui/utils": "0.2.356-
|
|
6
|
+
"@libs-ui/utils": "0.2.356-21",
|
|
7
7
|
"rxjs": "~7.8.0"
|
|
8
8
|
},
|
|
9
9
|
"sideEffects": false,
|