UNPKG

ng-spy

Version:

A lightweight, dependecy-free scrollspy for angular. Use this library to spy on HTML elements on your page when the window is scrolled or resized.

1 lines 21.1 kB
{"version":3,"file":"ng-spy.mjs","sources":["../../../projects/ng-spy/src/lib/tokens/resize-threshold.token.ts","../../../projects/ng-spy/src/lib/tokens/scroll-threshold.token.ts","../../../projects/ng-spy/src/lib/window.service.ts","../../../projects/ng-spy/src/lib/scroll-spy.service.ts","../../../projects/ng-spy/src/lib/spy-on.directive.ts","../../../projects/ng-spy/src/lib/spy-target.directive.ts","../../../projects/ng-spy/src/lib/scroll-spy.module.ts","../../../projects/ng-spy/src/public-api.ts","../../../projects/ng-spy/src/ng-spy.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const RESIZE_TIME_THRESHOLD: InjectionToken<number> = new InjectionToken('Time in milli-seconds', {\n providedIn: 'root',\n factory: () => 300\n});\n","import { InjectionToken } from '@angular/core';\n\nexport const SCROLL_TIME_THRESHOLD: InjectionToken<number> = new InjectionToken('Time in milli-seconds', {\n providedIn: 'root',\n factory: () => 10\n});\n","import { isPlatformBrowser } from '@angular/common';\nimport { ElementRef, Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { EMPTY, fromEvent, Observable } from 'rxjs';\nimport { auditTime } from 'rxjs/operators';\nimport { RESIZE_TIME_THRESHOLD } from './tokens/resize-threshold.token';\nimport { SCROLL_TIME_THRESHOLD } from './tokens/scroll-threshold.token';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WindowService {\n private isBrowser = true;\n private scrollEvent$: Observable<Event>;\n private resizeEvent$: Observable<Event>;\n\n constructor(\n @Inject(PLATFORM_ID) platformId,\n @Inject(RESIZE_TIME_THRESHOLD) private resizeTime: number,\n @Inject(SCROLL_TIME_THRESHOLD) private scrollTime: number\n ) {\n if (!isPlatformBrowser(platformId)) {\n this.isBrowser = false;\n this.scrollEvent$ = this.resizeEvent$ = EMPTY;\n } else {\n this.scrollEvent$ = fromEvent(window, 'scroll', { passive: true }).pipe(auditTime(this.scrollTime));\n this.resizeEvent$ = fromEvent(window, 'resize', { passive: true }).pipe(auditTime(this.resizeTime));\n }\n }\n\n getScrollEventForContainer(scrollContainer: ElementRef) {\n if (!this.isBrowser) {\n return EMPTY;\n }\n\n return fromEvent(scrollContainer.nativeElement, 'scroll', { passive: true }).pipe(auditTime(this.scrollTime));\n }\n\n get scrollEvent() {\n return this.scrollEvent$;\n }\n\n get resizeEvent() {\n return this.resizeEvent$;\n }\n\n get scrollTop() {\n if (!this.isBrowser) {\n return 0;\n }\n\n return Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop);\n }\n\n get viewportHeight() {\n if (!this.isBrowser) {\n return 0;\n }\n\n return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n }\n\n getElementHeight(el: ElementRef) {\n if (!this.isBrowser) {\n return 0;\n }\n\n return el.nativeElement.offsetHeight;\n }\n\n getElementOffsetTop(el: ElementRef) {\n if (!this.isBrowser) {\n return 0;\n }\n\n return el.nativeElement.offsetTop;\n }\n\n getElementScrollTop(el: ElementRef) {\n if (!this.isBrowser) {\n return 0;\n }\n\n return el.nativeElement.scrollTop;\n }\n}\n","import { ElementRef, Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { SpyTarget } from './spy-target.model';\nimport { WindowService } from './window.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ScrollSpyService {\n private stopSpying$ = new Subject();\n private activeSpyTarget$ = new Subject<string>();\n private scrollEvent: Observable<Event>;\n private resizeEvent: Observable<Event>;\n private spyTargets: SpyTarget[] = [];\n private thresholdTop = 0;\n private thresholdBottom = 0;\n private scrollContainer: ElementRef;\n private isSpying = false;\n\n constructor(private windowService: WindowService) {\n this.scrollEvent = this.windowService.scrollEvent.pipe(takeUntil(this.stopSpying$));\n this.resizeEvent = this.windowService.resizeEvent.pipe(takeUntil(this.stopSpying$));\n }\n\n spy({ scrollContainer, thresholdTop = 0, thresholdBottom = 0 }: SpyOptions = {}) {\n // this is to prevent duplicate listeners\n if (this.isSpying) {\n return;\n }\n\n this.isSpying = true;\n this.scrollContainer = scrollContainer;\n this.thresholdTop = thresholdTop;\n this.thresholdBottom = thresholdBottom;\n\n this.scrollEvent.subscribe(() => this.checkActiveElement(scrollContainer));\n this.resizeEvent.subscribe(() => this.checkActiveElement(scrollContainer));\n\n if (scrollContainer != null) {\n this.windowService.getScrollEventForContainer(scrollContainer)\n .pipe(takeUntil(this.stopSpying$))\n .subscribe(() => this.checkActiveElement(scrollContainer));\n }\n\n this.checkActiveElement(scrollContainer);\n }\n\n addTarget(target: SpyTarget) {\n this.spyTargets.push({ ...target });\n this.checkActiveElement(this.scrollContainer);\n }\n\n removeTarget(target: string) {\n this.spyTargets = this.spyTargets.filter(spyTarget => target !== spyTarget.name);\n this.checkActiveElement(this.scrollContainer);\n }\n\n checkActiveElement(scrollContainer?: ElementRef) {\n let activeTarget: SpyTarget = null;\n\n for (const target of this.spyTargets) {\n const activeElement = activeTarget != null ? activeTarget.element : null;\n if (this.isElementActive(target.element, scrollContainer, activeElement)) {\n activeTarget = target;\n }\n }\n\n this.activeSpyTarget$.next(activeTarget ? activeTarget.name : null);\n }\n\n isElementActive(element: ElementRef, scrollContainer?: ElementRef, currentActiveElement?: ElementRef) {\n const targetOffsetTop = this.windowService.getElementOffsetTop(element);\n const targetHeight = this.windowService.getElementHeight(element);\n\n if (currentActiveElement != null && this.windowService.getElementOffsetTop(currentActiveElement) > targetOffsetTop) {\n return false;\n }\n\n const hasContainer = (scrollContainer != null);\n\n const isInsideWindow = this.isElementInsideWindow(hasContainer, targetHeight, targetOffsetTop);\n\n if (isInsideWindow && !hasContainer) {\n return true;\n }\n\n return isInsideWindow && hasContainer && this.isElementInsiedScrollContainer(scrollContainer, targetHeight, targetOffsetTop);\n }\n\n private isElementInsideWindow(hasContainer: boolean, elementHeight: number, elementOffsetTop: number) {\n const scrollTop = this.windowService.scrollTop;\n const viewportHeight = this.windowService.viewportHeight;\n\n // target bottom edge is below window top edge && target top edge is above window bottom edge\n // if target has a container, don't check for thresholds on the window\n if (hasContainer) {\n return elementOffsetTop + elementHeight > scrollTop\n && elementOffsetTop < scrollTop + viewportHeight;\n }\n\n return elementOffsetTop + elementHeight > scrollTop + this.thresholdTop\n && elementOffsetTop < scrollTop + viewportHeight - this.thresholdBottom;\n }\n\n private isElementInsiedScrollContainer(container: ElementRef, elementHeight: number, elementOffsetTop: number) {\n const scrollContainerScrollTop = this.windowService.getElementScrollTop(container);\n const scrollContainerHeight = this.windowService.getElementHeight(container);\n const elementOffsetTopFromParent = elementOffsetTop - this.windowService.getElementOffsetTop(container);\n\n // element bottom edge is below container top edge && element top edge is above container bottom edge\n return elementOffsetTopFromParent + elementHeight > scrollContainerScrollTop + this.thresholdTop\n && elementOffsetTopFromParent < scrollContainerScrollTop + scrollContainerHeight - this.thresholdBottom;\n }\n\n get activeSpyTarget() {\n return this.activeSpyTarget$.asObservable();\n }\n\n stopSpying() {\n this.stopSpying$.next();\n this.spyTargets = [];\n this.isSpying = false;\n }\n}\n\ninterface SpyOptions {\n scrollContainer?: ElementRef;\n thresholdTop?: number;\n thresholdBottom?: number;\n}\n","import { Directive, ElementRef, Renderer2, Input, OnInit } from '@angular/core';\n\nimport { ScrollSpyService } from './scroll-spy.service';\n\n@Directive({\n selector: '[spyOn]'\n})\nexport class SpyOnDirective implements OnInit {\n\n @Input() activeClass: string;\n @Input() spyOn: string;\n private isActive = false;\n\n constructor(private el: ElementRef, private renderer: Renderer2, private spyService: ScrollSpyService) { }\n\n ngOnInit() {\n this.spyService.activeSpyTarget.subscribe(\n (targetName) => {\n if (!this.isActive && targetName === this.spyOn) {\n this.setActive();\n } else if (this.isActive && targetName !== this.spyOn) {\n this.setInActive();\n }\n }\n );\n }\n\n private get htmlElement() {\n return this.el.nativeElement;\n }\n\n setActive() {\n this.isActive = true;\n if (this.activeClass) {\n this.renderer.addClass(this.htmlElement, this.activeClass);\n }\n }\n\n setInActive() {\n this.isActive = false;\n if (this.activeClass) {\n this.renderer.removeClass(this.htmlElement, this.activeClass);\n }\n }\n}\n","import { Directive, ElementRef, Input, OnInit, Renderer2, OnDestroy } from '@angular/core';\n\nimport { ScrollSpyService } from './scroll-spy.service';\n\n@Directive({\n selector: '[spyTarget]'\n})\nexport class SpyTargetDirective implements OnInit, OnDestroy {\n\n @Input() spyTarget: string;\n\n constructor(private el: ElementRef, private spyService: ScrollSpyService, private renderer: Renderer2) { }\n\n ngOnInit() {\n this.renderer.setAttribute(this.htmlElement, 'id', this.spyTarget);\n this.spyService.addTarget({ name: this.spyTarget, element: this.el });\n }\n\n private get htmlElement() {\n return this.el.nativeElement;\n }\n\n ngOnDestroy() {\n this.spyService.removeTarget(this.spyTarget);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { SpyTargetDirective } from './spy-target.directive';\nimport { SpyOnDirective } from './spy-on.directive';\n\n@NgModule({\n declarations: [SpyTargetDirective, SpyOnDirective],\n imports: [\n ],\n exports: [SpyTargetDirective, SpyOnDirective]\n})\nexport class ScrollSpyModule { }\n","/*\n * Public API Surface of scroll-spy\n */\n\nexport * from './lib/scroll-spy.service';\nexport * from './lib/tokens/resize-threshold.token';\nexport * from './lib/tokens/scroll-threshold.token';\nexport * from './lib/spy-on.directive';\nexport * from './lib/spy-target.directive';\nexport * from './lib/scroll-spy.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WindowService","i1.ScrollSpyService"],"mappings":"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"}