angular-view-observer-directive 1.0.0
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/esm2022/angular-view-observer-directive.mjs +5 -0
- package/esm2022/lib/angular-view-observer.directive.mjs +53 -0
- package/esm2022/public-api.mjs +5 -0
- package/fesm2022/angular-view-observer-directive.mjs +64 -0
- package/fesm2022/angular-view-observer-directive.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/angular-view-observer.directive.d.ts +14 -0
- package/package.json +25 -0
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci12aWV3LW9ic2VydmVyLWRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdmlldy1vYnNlcnZlci1kaXJlY3RpdmUvc3JjL2FuZ3VsYXItdmlldy1vYnNlcnZlci1kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DestroyRef, Directive, effect, ElementRef, inject, input, output } from '@angular/core';
|
|
2
|
+
import { debounceTime, Subject } from "rxjs";
|
|
3
|
+
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class AngularViewObserverDirective {
|
|
6
|
+
//#endregion
|
|
7
|
+
//#region Constructor
|
|
8
|
+
constructor() {
|
|
9
|
+
//#region Injection
|
|
10
|
+
this._el = inject(ElementRef);
|
|
11
|
+
this.destroyRef = inject(DestroyRef);
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region Inputs and Outputs
|
|
14
|
+
this.threshold = input(0.1);
|
|
15
|
+
this.ancestorSelector = input();
|
|
16
|
+
this.observerCallback = input();
|
|
17
|
+
this.visibleChange = output();
|
|
18
|
+
this.observer$ = new Subject();
|
|
19
|
+
this.observer$.asObservable().pipe(debounceTime(11), takeUntilDestroyed(this.destroyRef)).subscribe(entry => {
|
|
20
|
+
this.visibleChange.emit(entry.isIntersecting);
|
|
21
|
+
});
|
|
22
|
+
effect(() => {
|
|
23
|
+
const selector = this.ancestorSelector();
|
|
24
|
+
const callback = this.observerCallback();
|
|
25
|
+
let observerOptions = {
|
|
26
|
+
root: null,
|
|
27
|
+
threshold: this.threshold(),
|
|
28
|
+
rootMargin: '0px',
|
|
29
|
+
};
|
|
30
|
+
if (selector) {
|
|
31
|
+
observerOptions.root = this._el.nativeElement.closest(selector);
|
|
32
|
+
}
|
|
33
|
+
this.observer?.disconnect();
|
|
34
|
+
this.observer = new IntersectionObserver((entries, observer) => {
|
|
35
|
+
this.observer$.next(entries[0]);
|
|
36
|
+
if (callback) {
|
|
37
|
+
callback(entries, observer);
|
|
38
|
+
}
|
|
39
|
+
}, observerOptions);
|
|
40
|
+
this.observer.observe(this._el.nativeElement);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularViewObserverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
44
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.12", type: AngularViewObserverDirective, isStandalone: true, selector: "[viewObserver]", inputs: { threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, ancestorSelector: { classPropertyName: "ancestorSelector", publicName: "ancestorSelector", isSignal: true, isRequired: false, transformFunction: null }, observerCallback: { classPropertyName: "observerCallback", publicName: "observerCallback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0 }); }
|
|
45
|
+
}
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularViewObserverDirective, decorators: [{
|
|
47
|
+
type: Directive,
|
|
48
|
+
args: [{
|
|
49
|
+
selector: '[viewObserver]',
|
|
50
|
+
standalone: true
|
|
51
|
+
}]
|
|
52
|
+
}], ctorParameters: () => [] });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci12aWV3LW9ic2VydmVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdmlldy1vYnNlcnZlci1kaXJlY3RpdmUvc3JjL2xpYi9hbmd1bGFyLXZpZXctb2JzZXJ2ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7O0FBTTlELE1BQU0sT0FBTyw0QkFBNEI7SUFrQnZDLFlBQVk7SUFFWixxQkFBcUI7SUFDckI7UUFuQkEsbUJBQW1CO1FBQ1gsUUFBRyxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDbEQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxZQUFZO1FBRVosNEJBQTRCO1FBQ3JCLGNBQVMsR0FBRyxLQUFLLENBQVMsR0FBRyxDQUFDLENBQUM7UUFDL0IscUJBQWdCLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDbkMscUJBQWdCLEdBQUcsS0FBSyxFQUFZLENBQUM7UUFFckMsa0JBQWEsR0FBRyxNQUFNLEVBQVcsQ0FBQztRQUtqQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQTZCLENBQUM7UUFLM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQ2hDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDL0MsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekMsSUFBSSxlQUFlLEdBQTZCO2dCQUM5QyxJQUFJLEVBQUUsSUFBSTtnQkFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDM0IsVUFBVSxFQUFFLEtBQUs7YUFDbEIsQ0FBQTtZQUNELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFFNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG9CQUFvQixDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRXBCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDOytHQXBEVSw0QkFBNEI7bUdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFKeEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBvdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gXCJAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcFwiO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbdmlld09ic2VydmVyXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclZpZXdPYnNlcnZlckRpcmVjdGl2ZSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBJbmplY3Rpb25cclxuICBwcml2YXRlIF9lbCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XHJcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzIGFuZCBPdXRwdXRzXHJcbiAgcHVibGljIHRocmVzaG9sZCA9IGlucHV0PG51bWJlcj4oMC4xKTtcclxuICBwdWJsaWMgYW5jZXN0b3JTZWxlY3RvciA9IGlucHV0PHN0cmluZz4oKTtcclxuICBwdWJsaWMgb2JzZXJ2ZXJDYWxsYmFjayA9IGlucHV0PEZ1bmN0aW9uPigpO1xyXG5cclxuICBwdWJsaWMgdmlzaWJsZUNoYW5nZSA9IG91dHB1dDxib29sZWFuPigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gUHJvcGVydGllc1xyXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgb2JzZXJ2ZXIkID0gbmV3IFN1YmplY3Q8SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeT4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIENvbnN0cnVjdG9yXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm9ic2VydmVyJC5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMTEpLFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgKS5zdWJzY3JpYmUoZW50cnkgPT4ge1xyXG4gICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChlbnRyeS5pc0ludGVyc2VjdGluZylcclxuICAgIH0pXHJcblxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmFuY2VzdG9yU2VsZWN0b3IoKTtcclxuICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLm9ic2VydmVyQ2FsbGJhY2soKTtcclxuICAgICAgbGV0IG9ic2VydmVyT3B0aW9uczogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJJbml0ID0ge1xyXG4gICAgICAgIHJvb3Q6IG51bGwsXHJcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnRocmVzaG9sZCgpLFxyXG4gICAgICAgIHJvb3RNYXJnaW46ICcwcHgnLFxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xyXG5cclxuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcywgb2JzZXJ2ZXIpID0+IHtcclxuICAgICAgICB0aGlzLm9ic2VydmVyJC5uZXh0KGVudHJpZXNbMF0pO1xyXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgY2FsbGJhY2soZW50cmllcywgb2JzZXJ2ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKTtcclxuXHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH0pXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of angular-view-observer-directive
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/angular-view-observer.directive';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdmlldy1vYnNlcnZlci1kaXJlY3RpdmUvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHVDQUF1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFuZ3VsYXItdmlldy1vYnNlcnZlci1kaXJlY3RpdmVcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hbmd1bGFyLXZpZXctb2JzZXJ2ZXIuZGlyZWN0aXZlJztcclxuIl19
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, DestroyRef, input, output, effect, Directive } from '@angular/core';
|
|
3
|
+
import { Subject, debounceTime } from 'rxjs';
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
+
|
|
6
|
+
class AngularViewObserverDirective {
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region Constructor
|
|
9
|
+
constructor() {
|
|
10
|
+
//#region Injection
|
|
11
|
+
this._el = inject(ElementRef);
|
|
12
|
+
this.destroyRef = inject(DestroyRef);
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region Inputs and Outputs
|
|
15
|
+
this.threshold = input(0.1);
|
|
16
|
+
this.ancestorSelector = input();
|
|
17
|
+
this.observerCallback = input();
|
|
18
|
+
this.visibleChange = output();
|
|
19
|
+
this.observer$ = new Subject();
|
|
20
|
+
this.observer$.asObservable().pipe(debounceTime(11), takeUntilDestroyed(this.destroyRef)).subscribe(entry => {
|
|
21
|
+
this.visibleChange.emit(entry.isIntersecting);
|
|
22
|
+
});
|
|
23
|
+
effect(() => {
|
|
24
|
+
const selector = this.ancestorSelector();
|
|
25
|
+
const callback = this.observerCallback();
|
|
26
|
+
let observerOptions = {
|
|
27
|
+
root: null,
|
|
28
|
+
threshold: this.threshold(),
|
|
29
|
+
rootMargin: '0px',
|
|
30
|
+
};
|
|
31
|
+
if (selector) {
|
|
32
|
+
observerOptions.root = this._el.nativeElement.closest(selector);
|
|
33
|
+
}
|
|
34
|
+
this.observer?.disconnect();
|
|
35
|
+
this.observer = new IntersectionObserver((entries, observer) => {
|
|
36
|
+
this.observer$.next(entries[0]);
|
|
37
|
+
if (callback) {
|
|
38
|
+
callback(entries, observer);
|
|
39
|
+
}
|
|
40
|
+
}, observerOptions);
|
|
41
|
+
this.observer.observe(this._el.nativeElement);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularViewObserverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
45
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.12", type: AngularViewObserverDirective, isStandalone: true, selector: "[viewObserver]", inputs: { threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, ancestorSelector: { classPropertyName: "ancestorSelector", publicName: "ancestorSelector", isSignal: true, isRequired: false, transformFunction: null }, observerCallback: { classPropertyName: "observerCallback", publicName: "observerCallback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0 }); }
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularViewObserverDirective, decorators: [{
|
|
48
|
+
type: Directive,
|
|
49
|
+
args: [{
|
|
50
|
+
selector: '[viewObserver]',
|
|
51
|
+
standalone: true
|
|
52
|
+
}]
|
|
53
|
+
}], ctorParameters: () => [] });
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* Public API Surface of angular-view-observer-directive
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Generated bundle index. Do not edit.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
export { AngularViewObserverDirective };
|
|
64
|
+
//# sourceMappingURL=angular-view-observer-directive.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-view-observer-directive.mjs","sources":["../../../projects/angular-view-observer-directive/src/lib/angular-view-observer.directive.ts","../../../projects/angular-view-observer-directive/src/public-api.ts","../../../projects/angular-view-observer-directive/src/angular-view-observer-directive.ts"],"sourcesContent":["import {DestroyRef, Directive, effect, ElementRef, inject, input, output} from '@angular/core';\r\nimport {debounceTime, Subject} from \"rxjs\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Directive({\r\n selector: '[viewObserver]',\r\n standalone: true\r\n})\r\nexport class AngularViewObserverDirective {\r\n\r\n //#region Injection\r\n private _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private destroyRef = inject(DestroyRef);\r\n //#endregion\r\n\r\n //#region Inputs and Outputs\r\n public threshold = input<number>(0.1);\r\n public ancestorSelector = input<string>();\r\n public observerCallback = input<Function>();\r\n\r\n public visibleChange = output<boolean>();\r\n //#endregion\r\n\r\n //#region Properties\r\n private observer: IntersectionObserver | undefined;\r\n private observer$ = new Subject<IntersectionObserverEntry>();\r\n //#endregion\r\n\r\n //#region Constructor\r\n constructor() {\r\n this.observer$.asObservable().pipe(\r\n debounceTime(11),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(entry => {\r\n this.visibleChange.emit(entry.isIntersecting)\r\n })\r\n\r\n effect(() => {\r\n const selector = this.ancestorSelector();\r\n const callback = this.observerCallback();\r\n let observerOptions: IntersectionObserverInit = {\r\n root: null,\r\n threshold: this.threshold(),\r\n rootMargin: '0px',\r\n }\r\n if (selector) {\r\n observerOptions.root = this._el.nativeElement.closest(selector);\r\n }\r\n\r\n this.observer?.disconnect();\r\n\r\n this.observer = new IntersectionObserver((entries, observer) => {\r\n this.observer$.next(entries[0]);\r\n if (callback) {\r\n callback(entries, observer);\r\n }\r\n }, observerOptions);\r\n\r\n this.observer.observe(this._el.nativeElement);\r\n })\r\n }\r\n //#endregion\r\n}\r\n","/*\r\n * Public API Surface of angular-view-observer-directive\r\n */\r\n\r\nexport * from './lib/angular-view-observer.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class AngularViewObserverDirective {
|
|
3
|
+
private _el;
|
|
4
|
+
private destroyRef;
|
|
5
|
+
threshold: import("@angular/core").InputSignal<number>;
|
|
6
|
+
ancestorSelector: import("@angular/core").InputSignal<string | undefined>;
|
|
7
|
+
observerCallback: import("@angular/core").InputSignal<Function | undefined>;
|
|
8
|
+
visibleChange: import("@angular/core").OutputEmitterRef<boolean>;
|
|
9
|
+
private observer;
|
|
10
|
+
private observer$;
|
|
11
|
+
constructor();
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AngularViewObserverDirective, never>;
|
|
13
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<AngularViewObserverDirective, "[viewObserver]", never, { "threshold": { "alias": "threshold"; "required": false; "isSignal": true; }; "ancestorSelector": { "alias": "ancestorSelector"; "required": false; "isSignal": true; }; "observerCallback": { "alias": "observerCallback"; "required": false; "isSignal": true; }; }, { "visibleChange": "visibleChange"; }, never, never, true, never>;
|
|
14
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "angular-view-observer-directive",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": ">=17.0.0",
|
|
6
|
+
"@angular/core": ">=17.0.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"module": "fesm2022/angular-view-observer-directive.mjs",
|
|
13
|
+
"typings": "index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./index.d.ts",
|
|
20
|
+
"esm2022": "./esm2022/angular-view-observer-directive.mjs",
|
|
21
|
+
"esm": "./esm2022/angular-view-observer-directive.mjs",
|
|
22
|
+
"default": "./fesm2022/angular-view-observer-directive.mjs"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/angular-view-observer.directive';
|