@thejlifex/ngx-scroll-spy
Version:
An Angular library that can spy the position of elements (inside a scrollable container) and emit the currently active (visible) element in the viewport.
1 lines • 23.8 kB
Source Map (JSON)
{"version":3,"file":"thejlifex-ngx-scroll-spy.mjs","sources":["../../../projects/ngx-scroll-spy/src/lib/scroll-spy.ts","../../../projects/ngx-scroll-spy/src/lib/scroll-spy.service.ts","../../../projects/ngx-scroll-spy/src/lib/spy.directive.ts","../../../projects/ngx-scroll-spy/src/lib/spy-target.directive.ts","../../../projects/ngx-scroll-spy/src/lib/spy-target-container.directive.ts","../../../projects/ngx-scroll-spy/src/public-api.ts","../../../projects/ngx-scroll-spy/src/thejlifex-ngx-scroll-spy.ts"],"sourcesContent":["import { Subject, Subscription, fromEvent, debounceTime, Observable } from 'rxjs';\r\nimport { ScrollSpyOptions } from './models/scroll-spy-options';\r\nimport { SpyTarget } from './models/spy-target';\r\nimport { SpyTargetIsIntersectingEvent } from './models/spy-target-is-intersecting-event';\r\n\r\n/**\r\n * Encapsulates the logic for scroll spy on a scrollable element (`scrollContainer`).\r\n *\r\n * Scroll spy uses the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API).\r\n *\r\n * Supports window resizing.\r\n *\r\n * Inspired by:\r\n * - https://grafikart.fr/tutoriels/scrollspy-js-page-491\r\n * - https://codepen.io/diaphragm/pen/bGNBVxw\r\n * - https://github.com/chefomar/angular-scroll-spy\r\n */\r\nexport class ScrollSpy {\r\n\r\n private readonly spyTargetIsIntersectingSubject$: Subject<SpyTargetIsIntersectingEvent> = new Subject<SpyTargetIsIntersectingEvent>();\r\n /**\r\n * Is emitted when a spy-target has transitioned into a state of intersection (`isIntersecting: true`) or out of a state of intersection (`isIntersecting: false`).\r\n */\r\n readonly spyTargetIsIntersecting$: Observable<SpyTargetIsIntersectingEvent> = this.spyTargetIsIntersectingSubject$.asObservable();\r\n private resizeSubscription?: Subscription;\r\n private spyTargets: SpyTarget[] = [];\r\n private intersectionObserver: IntersectionObserver | null = null;\r\n private readonly resizeDebounceTime: number = 300;\r\n /**\r\n * Defines the (vertical) position of the IntersectionObserver line.\r\n * Value between `0` (at the top) and `100` (at the bottom).\r\n *\r\n * @todo (For a future version of ngx-scroll-spy) This property should be configured by the user.\r\n */\r\n private readonly offset: number = 20;\r\n\r\n constructor({ scrollContainer }: ScrollSpyOptions = {}) {\r\n this.initIntersectionObserver(scrollContainer);\r\n\r\n this.resizeSubscription = fromEvent(window, 'resize').pipe(\r\n debounceTime(this.resizeDebounceTime)\r\n ).subscribe(() => this.initIntersectionObserver(scrollContainer));\r\n }\r\n\r\n /**\r\n * Adds a spy-target and starts to observe that target.\r\n */\r\n addTarget(spyTarget: SpyTarget): void {\r\n this.spyTargets.push(spyTarget);\r\n this.intersectionObserver?.observe(spyTarget.element);\r\n }\r\n\r\n /**\r\n * Removes a spy-target and stops observing that target.\r\n */\r\n removeTarget(spyTarget: SpyTarget): void {\r\n this.spyTargets = this.spyTargets.filter(spyTarget => spyTarget.id !== spyTarget.id);\r\n this.intersectionObserver?.unobserve(spyTarget.element);\r\n }\r\n\r\n /**\r\n * Stops observing all spy-targets and completes spyTargetIsIntersecting$ subject.\r\n */\r\n stopSpying(): void {\r\n this.resizeSubscription?.unsubscribe();\r\n this.intersectionObserver?.disconnect();\r\n this.intersectionObserver = null;\r\n this.spyTargets = [];\r\n this.spyTargetIsIntersectingSubject$.complete();\r\n }\r\n\r\n /**\r\n * Initialize IntersectionObserver.\r\n */\r\n private initIntersectionObserver(scrollContainer?: Element): void {\r\n this.intersectionObserver?.disconnect();\r\n this.intersectionObserver = new IntersectionObserver(\r\n (entries) => this.intersectionObserverCallback(entries),\r\n {\r\n root: scrollContainer,\r\n rootMargin: `-${this.offset}% 0px -${100 - this.offset}% 0px` // IntersectionObserver as one line.\r\n }\r\n );\r\n for (const spyTarget of this.spyTargets) {\r\n this.intersectionObserver.observe(spyTarget.element);\r\n }\r\n }\r\n\r\n /**\r\n * A function which is called when one or more spy-targets have transitioned into a state of intersection (`isIntersecting: true`) or out of a state of intersection (`isIntersecting: false`).\r\n */\r\n private intersectionObserverCallback(entries: IntersectionObserverEntry[]): void {\r\n for (const entry of entries) {\r\n const spyTarget = this.spyTargets.find((item) => item.element === entry.target)!;\r\n this.spyTargetIsIntersectingSubject$.next({\r\n spyTarget,\r\n isIntersecting: entry.isIntersecting\r\n });\r\n }\r\n }\r\n}\r\n","import { Inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ScrollSpy } from './scroll-spy';\r\nimport { SpyTarget } from './models/spy-target';\r\nimport { SpyTargetIsIntersectingEvent } from './models/spy-target-is-intersecting-event';\r\nimport { isPlatformServer } from '@angular/common';\r\n\r\n/**\r\n * Scroll spy service.\r\n *\r\n * Creates a scroll-spy on the Document/Body per default and destroys it when the service is destroyed.\r\n *\r\n * Allows you to create (and destroy) scroll-spy on a scroll-container (any scrollable element).\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ScrollSpyService implements OnDestroy {\r\n /**\r\n * Default scroll-spy on the default scroll element (Document/Body).\r\n */\r\n private readonly defaultScrollSpy!: ScrollSpy;\r\n /**\r\n * Map containing created scroll-spies (on any scrollable elements).\r\n *\r\n * @key scrollContainerId\r\n * @value ScrollSpy\r\n */\r\n private readonly scrollSpies!: Map<string, ScrollSpy>;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: string) {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n this.defaultScrollSpy = new ScrollSpy();\r\n this.scrollSpies = new Map();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n this.defaultScrollSpy.stopSpying();\r\n this.scrollSpies.forEach((item) => item.stopSpying());\r\n this.scrollSpies.clear();\r\n }\r\n\r\n /**\r\n * Create a scroll-spy for the provided `scrollContainer`.\r\n */\r\n createScrollSpy(scrollContainerId: string, scrollContainer: Element): void {\r\n this.scrollSpies.set(scrollContainerId, new ScrollSpy({ scrollContainer }));\r\n }\r\n\r\n /**\r\n * Destroy the scroll-spy with ID equals the provided `scrollContainerId`.\r\n */\r\n destroyScrollSpy(scrollContainerId: string): void {\r\n this.scrollSpies.get(scrollContainerId)?.stopSpying();\r\n this.scrollSpies.delete(scrollContainerId);\r\n }\r\n\r\n /**\r\n * Get the `spyTargetIsIntersecting$` observable for the provided `scrollContainerId`,\r\n *\r\n * Or the `spyTargetIsIntersecting$` of the `defaultScrollSpy` when `scrollContainerId` is `undefined`.\r\n */\r\n getSpyTargetIsIntersecting$(scrollContainerId?: string): Observable<SpyTargetIsIntersectingEvent> {\r\n return this.getScrollSpy(scrollContainerId).spyTargetIsIntersecting$;\r\n }\r\n\r\n /**\r\n * Adds a spy-target and starts to observe that target.\r\n */\r\n addTarget(spyTarget: SpyTarget): void {\r\n this.getScrollSpy(spyTarget.containerId).addTarget(spyTarget);\r\n }\r\n\r\n /**\r\n * Removes a spy-target and stops observing that target.\r\n */\r\n removeTarget(spyTarget: SpyTarget): void {\r\n this.getScrollSpy(spyTarget.containerId).removeTarget(spyTarget);\r\n }\r\n\r\n /**\r\n * Get the scroll-spy for the proivded `scrollContainerId`.\r\n *\r\n * When `scrollContainerId` is `undefined` the `defaultScrollSpy` is returned.\r\n */\r\n private getScrollSpy(scrollContainerId?: string): ScrollSpy {\r\n if (!scrollContainerId) {\r\n return this.defaultScrollSpy;\r\n }\r\n const scrollSpy = this.scrollSpies.get(scrollContainerId);\r\n if (!scrollSpy) {\r\n throw new Error(`Unknown spyTargetContainerId: \"${scrollContainerId}\". Please make sure that the spyTargetContainerId inputs have the same value on the three directives: spy, spyTarget and spyTargetContainer.`);\r\n }\r\n return scrollSpy;\r\n }\r\n}\r\n","import { isPlatformServer } from '@angular/common';\r\nimport { Directive, Input, OnInit, OnDestroy, HostBinding, Inject, PLATFORM_ID, ChangeDetectorRef } from '@angular/core';\r\nimport { filter, Subject, takeUntil } from 'rxjs';\r\nimport { ScrollSpyService } from './scroll-spy.service';\r\n\r\n/**\r\n * Spies on the spyTarget that has the provided `spyTargetId`.\r\n */\r\n@Directive({\r\n selector: '[spy]',\r\n standalone: true\r\n})\r\nexport class SpyDirective implements OnInit, OnDestroy {\r\n\r\n /**\r\n * ID of the spyTarget to spy.\r\n */\r\n @Input() spyTargetId!: string;\r\n\r\n /**\r\n * @optional\r\n *\r\n * ID of the spyTargetContainer containing the spyTarget.\r\n */\r\n @Input() spyTargetContainerId?: string;\r\n\r\n /**\r\n * Class name to add to this element when the spyTarget has transitioned into a state of intersection (is visisble).\r\n *\r\n * @default\r\n * 'active'\r\n */\r\n @Input() spyActiveClass: string = 'active';\r\n\r\n @HostBinding('class') activeClassInDOM?: string;\r\n\r\n private directiveDestroyed$ = new Subject<void>();\r\n\r\n constructor(\r\n private scrollSpyService: ScrollSpyService,\r\n @Inject(PLATFORM_ID) private platformId: string,\r\n private changeDetectorRef: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n if (!this.spyTargetId) {\r\n throw new Error('SpyDirective: spyTargetId needs to be set.');\r\n }\r\n this.scrollSpyService.getSpyTargetIsIntersecting$(this.spyTargetContainerId)\r\n .pipe(\r\n takeUntil(this.directiveDestroyed$),\r\n filter((event) =>\r\n event.spyTarget.id === this.spyTargetId\r\n && event.spyTarget.containerId === this.spyTargetContainerId\r\n )\r\n )\r\n .subscribe((event) => {\r\n this.activeClassInDOM = event.isIntersecting ? this.spyActiveClass : undefined;\r\n /**\r\n * Manually trigger change detection to update activeClass in the DOM\r\n * (Needed for the case changeDetection OnPush is used).\r\n */\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.directiveDestroyed$.next();\r\n this.directiveDestroyed$.complete();\r\n }\r\n}\r\n","import { isPlatformServer } from '@angular/common';\r\nimport { Directive, ElementRef, Input, OnInit, OnDestroy, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { ScrollSpyService } from './scroll-spy.service';\r\nimport { SpyTarget } from './models/spy-target';\r\n\r\n/**\r\n * Adds this element as spy-target and starts to observe this target.\r\n *\r\n * Automatically removes this element as spy-target and stops observing this target when the element is destroyed.\r\n */\r\n@Directive({\r\n selector: '[spyTarget]',\r\n standalone: true\r\n})\r\nexport class SpyTargetDirective implements OnInit, OnDestroy {\r\n\r\n /**\r\n * ID for this spyTarget.\r\n */\r\n @Input() spyTargetId!: string;\r\n\r\n /**\r\n * @optional\r\n *\r\n * ID for the spyTargetContainer containing this spyTarget.\r\n */\r\n @Input() spyTargetContainerId?: string;\r\n\r\n private target!: SpyTarget;\r\n\r\n constructor(\r\n private elementRef: ElementRef<Element>,\r\n private scrollSpyService: ScrollSpyService,\r\n @Inject(PLATFORM_ID) private platformId: string\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n if (!this.spyTargetId) {\r\n throw new Error('SpyTargetDirective: spyTargetId needs to be set.');\r\n }\r\n this.target = {\r\n id: this.spyTargetId,\r\n element: this.elementRef.nativeElement,\r\n containerId: this.spyTargetContainerId\r\n };\r\n this.scrollSpyService.addTarget(this.target);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n this.scrollSpyService.removeTarget(this.target);\r\n }\r\n}\r\n","import { isPlatformServer } from '@angular/common';\r\nimport { Directive, Input, OnInit, OnDestroy, Inject, PLATFORM_ID, ElementRef } from '@angular/core';\r\nimport { ScrollSpyService } from './scroll-spy.service';\r\n\r\n/**\r\n * Creates a scroll-spy on this spy targets container (element).\r\n *\r\n * Automatically destroys the scroll-spy when the element is destroyed.\r\n *\r\n * This is useful:\r\n *\r\n * - when you have multiple (independent) scrollable elements on the same page,\r\n * - or the scrollable element on your page is not the browser default scrollable element, for example `<mat-sidenav-content>` if you are using [Angular Material Sidenav](https://material.angular.io/components/sidenav)\r\n *\r\n * where you want to have a scroll-spy.\r\n */\r\n@Directive({\r\n selector: '[spyTargetContainer]',\r\n standalone: true\r\n})\r\nexport class SpyTargetContainerDirective implements OnInit, OnDestroy {\r\n\r\n /**\r\n * ID for this spyTargetContainer.\r\n */\r\n @Input() spyTargetContainerId!: string;\r\n\r\n constructor(\r\n private scrollSpyService: ScrollSpyService,\r\n @Inject(PLATFORM_ID) private platformId: string,\r\n private elementRef: ElementRef<Element>,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n if (!this.spyTargetContainerId) {\r\n throw new Error('SpyTargetContainerDirective: spyTargetContainerId needs to be set.');\r\n }\r\n this.scrollSpyService.createScrollSpy(this.spyTargetContainerId, this.elementRef.nativeElement);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (isPlatformServer(this.platformId)) {\r\n return;\r\n }\r\n this.scrollSpyService.destroyScrollSpy(this.spyTargetContainerId);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-scroll-spy\r\n */\r\n\r\nexport * from './lib/spy.directive';\r\nexport * from './lib/spy-target.directive';\r\nexport * from './lib/spy-target-container.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}