UNPKG

ngx-scroll-to-vk

Version:

A simple Angular 4+ plugin enabling you to smooth scroll to any element on your page and enhance scroll-based features in your app.

1 lines 35.3 kB
{"version":3,"file":"ngx-scroll-to-vk.mjs","sources":["../../../projects/ngx-scroll-to/src/lib/scroll-to-helpers.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to-animation.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to.service.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to.directive.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to.module.ts","../../../projects/ngx-scroll-to/src/public-api.ts","../../../projects/ngx-scroll-to/src/ngx-scroll-to-vk.ts"],"sourcesContent":["import { ElementRef } from '@angular/core';\n\nimport { ScrollToAnimationEasingCollection } from './scroll-to-easing.interface';\nimport { ScrollToDefaultConfigOptions } from './scroll-to-config.interface';\n\n/** Default values for Component Input */\nexport const DEFAULTS: ScrollToDefaultConfigOptions = {\n target: null,\n action: 'click',\n duration: 650,\n easing: 'easeInOutQuad',\n offset: 0,\n offsetMap: new Map()\n};\n\n/** Easing Colleciton */\nexport const EASING: ScrollToAnimationEasingCollection = {\n easeInQuad: (time: number) => {\n return time * time;\n },\n easeOutQuad: (time: number) => {\n return time * (2 - time);\n },\n easeInOutQuad: (time: number) => {\n return time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time;\n },\n easeInCubic: (time: number) => {\n return time * time * time;\n },\n easeOutCubic: (time: number) => {\n return (--time) * time * time + 1;\n },\n easeInOutCubic: (time: number) => {\n return time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1;\n },\n easeInQuart: (time: number) => {\n return time * time * time * time;\n },\n easeOutQuart: (time: number) => {\n return 1 - (--time) * time * time * time;\n },\n easeInOutQuart: (time: number) => {\n return time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time;\n },\n easeInQuint: (time: number) => {\n return time * time * time * time * time;\n },\n easeOutQuint: (time: number) => {\n return 1 + (--time) * time * time * time * time;\n },\n easeInOutQuint: (time: number) => {\n return time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time;\n },\n easeOutElastic: (time: number) => {\n return Math.pow(2, -10 * time) * Math.sin((time - 1 / 4) * (2 * Math.PI) / 1) + 1;\n }\n};\n\n/**\n * Set of allowed events as triggers\n * for the Animation to start.\n */\nexport const EVENTS: string[] = [\n 'click',\n 'mouseenter',\n 'mouseover',\n 'mousedown',\n 'mouseup',\n 'dblclick',\n 'contextmenu',\n 'wheel',\n 'mouseleave',\n 'mouseout'\n];\n\n/**\n * Strip hash (#) from value.\n *\n * @param value \t\t\t\tThe given string value\n * @returns \t\t\t\t\tThe stripped string value\n */\nexport function stripHash(value: string): string {\n return value.substring(0, 1) === '#' ? value.substring(1) : value;\n}\n\n/**\n * Test if a given value is a string.\n *\n * @param value \t\t\t\t\tThe given value\n * @returns \t\t\t\t\t\tWhether the given value is a string\n */\nexport function isString(value: any): value is string {\n return typeof value === 'string' || value instanceof String;\n}\n\n/**\n * Test if a given Element is the Window.\n *\n * @param container \t\t\t\tThe given Element\n * @returns \t\t\t\t\t\tWhether the given Element is Window\n */\nexport function isWindow(container: any): container is Window {\n return container === window;\n}\n\n/**\n * Test if a given value is of type ElementRef.\n *\n * @param value \t\t\t\t\tThe given value\n * @returns Whether the given value is a number\n */\nexport function isElementRef(value: any): value is ElementRef {\n return value instanceof ElementRef;\n}\n\n/**\n * Whether or not the given value is a Native Element.\n *\n * @param value The given value\n * @returns Whether or not the value is a Native Element\n */\nexport function isNativeElement(value: any): value is HTMLElement {\n return value instanceof HTMLElement;\n}\n\n/**\n * Test if a given value is type number.\n *\n * @param value \t\t\t\t\tThe given value\n * @returns \t\t\t\t\t\tWhether the given value is a number\n */\nexport function isNumber(value: any): value is number {\n return !isNaN(parseFloat(value)) && isFinite(value);\n}\n","import { Observable, ReplaySubject } from 'rxjs';\n\nimport { EASING } from './scroll-to-helpers';\nimport { ScrollToConfigOptions, ScrollToListenerTarget } from './scroll-to-config.interface';\n\n/** Scroll To Animation */\nexport class ScrollToAnimation {\n\n /** Number of milliseconds for each Tick */\n private tick: number;\n\n /** Interval */\n private interval: any;\n\n /** Time Lapsed in milliseconds */\n private timeLapsed: number;\n\n /** Percentage of time lapsed */\n private percentage: number;\n\n /** Position of the Element */\n private position: number;\n\n /** Last Element Position */\n private lastPosition: number;\n\n /** Start Position of the Element */\n private startPosition: number;\n\n /** The Distance to scroll */\n private distance: number;\n\n /** Observable Source */\n private source$: ReplaySubject<number>;\n\n /** Scroll Top of the Window */\n private windowScrollTop: number;\n\n /** Mapped Offset taken from the active Offset Map */\n private mappedOffset: number;\n\n /**\n * Class Constructor.\n *\n * @param container The Container\n * @param listenerTarget The Element that listens for DOM Events\n * @param isWindow Whether or not the listener is the Window\n * @param to Position to scroll to\n * @param options Additional options for scrolling\n * @param isBrowser Whether or not execution runs in the browser\n * (as opposed to the server)\n */\n constructor(\n private container: HTMLElement,\n private listenerTarget: ScrollToListenerTarget,\n private readonly isWindow: boolean,\n private readonly to: number,\n private readonly options: ScrollToConfigOptions,\n private isBrowser: boolean\n ) {\n this.tick = 16;\n this.interval = null;\n this.lastPosition = null;\n this.timeLapsed = 0;\n\n this.windowScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n\n if (!this.container) {\n this.startPosition = this.windowScrollTop;\n } else {\n this.startPosition = this.isWindow ? this.windowScrollTop : this.container.scrollTop;\n }\n\n // Correction for Starting Position of nested HTML Elements\n if (this.container && !this.isWindow) {\n this.to = this.to - this.container.getBoundingClientRect().top + this.startPosition;\n }\n\n // Set Distance\n const directionalDistance = this.startPosition - this.to;\n this.distance = this.container ? Math.abs(this.startPosition - this.to) : this.to;\n\n this.mappedOffset = this.options.offset;\n\n // Set offset from Offset Map\n if (this.isBrowser) {\n this.options\n .offsetMap\n .forEach((value, key) => this.mappedOffset = window.innerWidth > key ? value : this.mappedOffset);\n }\n\n this.distance += this.mappedOffset * (directionalDistance <= 0 ? 1 : -1);\n this.source$ = new ReplaySubject();\n }\n\n /**\n * Start the new Scroll Animation.\n *\n * @returns Observable containing a number\n */\n start(): Observable<number> {\n clearInterval(this.interval);\n this.interval = setInterval(this.loop, this.tick);\n return this.source$.asObservable();\n }\n\n /**\n * Stop the current Scroll Animation Loop.\n *\n * @param force Force to stop the Animation Loop\n * @returns Void\n */\n stop(): void {\n clearInterval(this.interval);\n this.interval = null;\n this.source$.complete();\n }\n\n /** Recursively loop over the Scroll Animation */\n private loop = (): void => {\n\n this.timeLapsed += this.tick;\n this.percentage = (this.timeLapsed / this.options.duration);\n this.percentage = (this.percentage > 1) ? 1 : this.percentage;\n\n // Position Update\n this.position = this.startPosition +\n ((this.startPosition - this.to <= 0 ? 1 : -1) *\n this.distance *\n EASING[this.options.easing](this.percentage));\n\n if (this.lastPosition !== null && this.position === this.lastPosition) {\n this.stop();\n } else {\n this.source$.next(this.position);\n this.isWindow\n ? this.listenerTarget.scrollTo(0, Math.floor(this.position))\n : this.container.scrollTop = Math.floor(this.position);\n this.lastPosition = this.position;\n }\n }\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\nimport {\n ScrollToConfigOptions,\n ScrollToConfigOptionsTarget,\n ScrollToListenerTarget,\n ScrollToTarget\n} from './scroll-to-config.interface';\nimport { ScrollToAnimation } from './scroll-to-animation';\nimport { DEFAULTS, isElementRef, isNativeElement, isNumber, isString, isWindow, stripHash } from './scroll-to-helpers';\nimport { Observable, ReplaySubject, throwError } from 'rxjs';\n\n/**\n * The Scroll To Service handles starting, interrupting\n * and ending the actual Scroll Animation. It provides\n * some utilities to find the proper HTML Element on a\n * given page to setup Event Listeners and calculate\n * distances for the Animation.\n */\n@Injectable()\nexport class ScrollToService {\n\n /**\n * The animation that provides the scrolling\n * to happen smoothly over time. Defining it here\n * allows for usage of e.g. `start` and `stop`\n * methods within this Angular Service.\n */\n private animation: ScrollToAnimation;\n\n /**\n * Interruptive Events allow to scrolling animation\n * to be interrupted before it is finished. The list\n * of Interruptive Events represents those.\n */\n private interruptiveEvents: string[];\n\n /**\n * Construct and setup required paratemeters.\n *\n * @param document A Reference to the Document\n * @param platformId Angular Platform ID\n */\n constructor(\n @Inject(DOCUMENT) private document: any,\n @Inject(PLATFORM_ID) private platformId: any\n ) {\n this.interruptiveEvents = ['mousewheel', 'DOMMouseScroll', 'touchstart'];\n }\n\n /**\n * Target an Element to scroll to. Notice that the `TimeOut` decorator\n * ensures the executing to take place in the next Angular lifecycle.\n * This allows for scrolling to elements that are e.g. initially hidden\n * by means of `*ngIf`, but ought to be scrolled to eventually.\n *\n * @todo type 'any' in Observable should become custom type like 'ScrollToEvent' (base class), see issue comment:\n * - https://github.com/nicky-lenaers/ngx-scroll-to/issues/10#issuecomment-317198481\n *\n * @param options Configuration Object\n * @returns Observable\n */\n scrollTo(options: ScrollToConfigOptions): Observable<any> {\n\n if (!isPlatformBrowser(this.platformId)) {\n return new ReplaySubject().asObservable();\n }\n\n return this.start(options);\n }\n\n /**\n * Start a new Animation.\n *\n * @todo Emit proper events from subscription\n *\n * @param options Configuration Object\n * @returns Observable\n */\n private start(options: ScrollToConfigOptions): Observable<number> {\n\n // Merge config with default values\n const mergedConfigOptions = {\n ...DEFAULTS as ScrollToConfigOptions,\n ...options\n } as ScrollToConfigOptionsTarget;\n\n if (this.animation) {\n this.animation.stop();\n }\n\n const targetNode = this.getNode(mergedConfigOptions.target);\n if (mergedConfigOptions.target && !targetNode) {\n return throwError(() => new Error('Unable to find Target Element'));\n }\n\n const container: HTMLElement = this.getContainer(mergedConfigOptions, targetNode);\n if (mergedConfigOptions.container && !container) {\n return throwError(() => new Error('Unable to find Container Element'));\n }\n\n const listenerTarget = this.getListenerTarget(container) || window;\n\n let to = container ? container.getBoundingClientRect().top : 0;\n\n if (targetNode) {\n to = isWindow(listenerTarget) ?\n window.scrollY + targetNode.getBoundingClientRect().top :\n targetNode.getBoundingClientRect().top;\n }\n\n // Create Animation\n this.animation = new ScrollToAnimation(\n container,\n listenerTarget,\n isWindow(listenerTarget),\n to,\n mergedConfigOptions,\n isPlatformBrowser(this.platformId)\n );\n const onInterrupt = () => this.animation.stop();\n this.addInterruptiveEventListeners(listenerTarget, onInterrupt);\n\n // Start Animation\n const animation$ = this.animation.start();\n this.subscribeToAnimation(animation$, listenerTarget, onInterrupt);\n\n return animation$;\n }\n\n /**\n * Subscribe to the events emitted from the Scrolling\n * Animation. Events might be used for e.g. unsubscribing\n * once finished.\n *\n * @param animation$ The Animation Observable\n * @param listenerTarget The Listener Target for events\n * @param onInterrupt The handler for Interruptive Events\n * @returns Void\n */\n private subscribeToAnimation(\n animation$: Observable<any>,\n listenerTarget: ScrollToListenerTarget,\n onInterrupt: EventListenerOrEventListenerObject\n ) {\n const subscription = animation$\n .subscribe(\n {\n complete: () => {\n this.removeInterruptiveEventListeners(this.interruptiveEvents, listenerTarget, onInterrupt);\n subscription.unsubscribe();\n }\n }\n );\n }\n\n /**\n * Get the container HTML Element in which\n * the scrolling should happen.\n *\n * @param options The Merged Configuration Object\n * @param targetNode the targeted HTMLElement\n */\n private getContainer(options: ScrollToConfigOptions, targetNode: HTMLElement): HTMLElement | null {\n\n let container: HTMLElement | null = null;\n\n if (options.container) {\n container = this.getNode(options.container, true);\n } else if (targetNode) {\n container = this.getFirstScrollableParent(targetNode);\n }\n\n return container;\n }\n\n /**\n * Add listeners for the Animation Interruptive Events\n * to the Listener Target.\n *\n * @param events List of events to listen to\n * @param listenerTarget Target to attach the listener on\n * @param handler Handler for when the listener fires\n * @returns Void\n */\n private addInterruptiveEventListeners(\n listenerTarget: ScrollToListenerTarget,\n handler: EventListenerOrEventListenerObject): void {\n\n if (!listenerTarget) {\n listenerTarget = window;\n }\n\n this.interruptiveEvents\n .forEach(event => listenerTarget\n .addEventListener(event, handler, this.supportPassive() ? {passive: true} : false));\n }\n\n /**\n * Feature-detect support for passive event listeners.\n *\n * @returns Whether or not passive event listeners are supported\n */\n private supportPassive(): boolean {\n\n let supportsPassive = false;\n\n try {\n const opts = Object.defineProperty({}, 'passive', {\n get: () => {\n supportsPassive = true;\n }\n });\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n } catch (e) {\n }\n\n return supportsPassive;\n }\n\n /**\n * Remove listeners for the Animation Interrupt Event from\n * the Listener Target. Specifying the correct handler prevents\n * memory leaks and makes the allocated memory available for\n * Garbage Collection.\n *\n * @param events List of Interruptive Events to remove\n * @param listenerTarget Target to attach the listener on\n * @param handler Handler for when the listener fires\n * @returns Void\n */\n private removeInterruptiveEventListeners(\n events: string[],\n listenerTarget: ScrollToListenerTarget,\n handler: EventListenerOrEventListenerObject): void {\n\n if (!listenerTarget) {\n listenerTarget = window;\n }\n events.forEach(event => listenerTarget.removeEventListener(event, handler));\n }\n\n /**\n * Find the first scrollable parent Node of a given\n * Element. The DOM Tree gets searched upwards\n * to find this first scrollable parent. Parents might\n * be ignored by CSS styles applied to the HTML Element.\n *\n * @param nativeElement The Element to search the DOM Tree upwards from\n * @returns The first scrollable parent HTML Element\n */\n private getFirstScrollableParent(nativeElement: HTMLElement): HTMLElement {\n\n let style: CSSStyleDeclaration = window.getComputedStyle(nativeElement);\n\n const overflowRegex: RegExp = /(auto|scroll|overlay)/;\n\n if (style.position === 'fixed') {\n return null;\n }\n\n let parent = nativeElement;\n while (parent.parentElement) {\n parent = parent.parentElement;\n style = window.getComputedStyle(parent);\n\n if (style.position === 'absolute'\n || style.overflow === 'hidden'\n || style.overflowY === 'hidden') {\n continue;\n }\n\n if (overflowRegex.test(style.overflow + style.overflowY)\n || parent.tagName === 'BODY') {\n return parent;\n }\n }\n\n return null;\n }\n\n /**\n * Get the Target Node to scroll to.\n *\n * @param id The given ID of the node, either a string or\n * an element reference\n * @param allowBodyTag Indicate whether or not the Document Body is\n * considered a valid Target Node\n * @returns The Target Node to scroll to\n */\n private getNode(id: ScrollToTarget, allowBodyTag: boolean = false): HTMLElement {\n\n let targetNode: HTMLElement;\n\n if (isString(id)) {\n if (allowBodyTag && (id === 'body' || id === 'BODY')) {\n targetNode = this.document.body;\n } else {\n targetNode = this.document.getElementById(stripHash(id));\n }\n } else if (isNumber(id)) {\n targetNode = this.document.getElementById(String(id));\n } else if (isElementRef(id)) {\n targetNode = id.nativeElement;\n } else if (isNativeElement(id)) {\n targetNode = id;\n }\n\n return targetNode;\n }\n\n /**\n * Retrieve the Listener target. This Listener Target is used\n * to attach Event Listeners on. In case of the target being\n * the Document Body, we need the actual `window` to listen\n * for events.\n *\n * @param container The HTML Container element\n * @returns The Listener Target to attach events on\n */\n private getListenerTarget(container: HTMLElement): ScrollToListenerTarget {\n if (!container) {\n return null;\n }\n return this.isDocumentBody(container) ? window : container;\n }\n\n /**\n * Test if a given HTML Element is the Document Body.\n *\n * @param element The given HTML Element\n * @returns Whether or not the Element is the\n * Document Body Element\n */\n private isDocumentBody(element: HTMLElement): element is HTMLBodyElement {\n return element.tagName.toUpperCase() === 'BODY';\n }\n}\n","import { AfterViewInit, Directive, ElementRef, Input, Renderer2 } from '@angular/core';\n\nimport { DEFAULTS, EVENTS } from './scroll-to-helpers';\nimport { ScrollToConfigOptions, ScrollToOffsetMap, ScrollToTarget } from './scroll-to-config.interface';\nimport { ScrollToAnimationEasing } from './scroll-to-easing.interface';\nimport { ScrollToEvent } from './scroll-to-event.interface';\nimport { ScrollToService } from './scroll-to.service';\n\n@Directive({\n selector: '[ngxScrollTo]'\n})\nexport class ScrollToDirective implements AfterViewInit {\n\n @Input()\n ngxScrollTo: ScrollToTarget = DEFAULTS.target;\n\n @Input()\n ngxScrollToEvent: ScrollToEvent = DEFAULTS.action;\n\n @Input()\n ngxScrollToDuration: number = DEFAULTS.duration;\n\n @Input()\n ngxScrollToEasing: ScrollToAnimationEasing = DEFAULTS.easing;\n\n @Input()\n ngxScrollToOffset: number = DEFAULTS.offset;\n\n @Input()\n ngxScrollToOffsetMap: ScrollToOffsetMap = DEFAULTS.offsetMap;\n\n private options: ScrollToConfigOptions;\n\n constructor(\n private elementRef: ElementRef,\n private scrollToService: ScrollToService,\n private renderer2: Renderer2) {\n }\n\n /**\n * Angular Lifecycle Hook - After View Init\n *\n * @todo Implement Subscription for Events\n *\n * @returns void\n */\n ngAfterViewInit(): void {\n\n // Test Event Support\n if (EVENTS.indexOf(this.ngxScrollToEvent) === -1) {\n throw new Error(`Unsupported Event '${this.ngxScrollToEvent}'`);\n }\n\n // Listen for the trigger...\n this.renderer2.listen(this.elementRef.nativeElement, this.ngxScrollToEvent,\n (event: Event) => {\n\n this.options = {\n target: this.ngxScrollTo,\n duration: this.ngxScrollToDuration,\n easing: this.ngxScrollToEasing,\n offset: this.ngxScrollToOffset,\n offsetMap: this.ngxScrollToOffsetMap\n };\n\n this.scrollToService.scrollTo(this.options);\n });\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { ScrollToDirective } from './scroll-to.directive';\nimport { ScrollToService } from './scroll-to.service';\n\n/** Scroll To Module */\n@NgModule({\n imports: [\n ScrollToDirective\n ],\n exports: [\n ScrollToDirective\n ]\n})\nexport class ScrollToModule {\n\n /**\n * Guaranteed singletons for provided Services across App.\n *\n * @return An Angular Module with Providers\n */\n static forRoot(): ModuleWithProviders<ScrollToModule> {\n return {\n ngModule: ScrollToModule,\n providers: [\n ScrollToService\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-scroll-to\n */\n\nexport * from './lib/scroll-to-config.interface';\nexport * from './lib/scroll-to-easing.interface';\nexport * from './lib/scroll-to.directive';\nexport * from './lib/scroll-to.module';\nexport * from './lib/scroll-to.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ScrollToService"],"mappings":"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"}