{"version":3,"file":"ngx-page-scroll-core.mjs","sources":["../../../projects/ngx-page-scroll-core/src/lib/page-scroll-instance.ts","../../../projects/ngx-page-scroll-core/src/lib/providers/config.provider.ts","../../../projects/ngx-page-scroll-core/src/lib/providers/ngx-page-scroll.service.ts","../../../projects/ngx-page-scroll-core/src/lib/ngx-page-scroll-core.module.ts","../../../projects/ngx-page-scroll-core/src/public-api.ts","../../../projects/ngx-page-scroll-core/src/ngx-page-scroll-core.ts"],"sourcesContent":["import { EventEmitter } from '@angular/core';\nimport { PageScrollConfig } from './types/page-scroll.config';\nimport { PageScrollTarget } from './types/page-scroll-target';\nimport { PageScrollViews } from './types/page-scroll-view';\nimport { EasingLogic } from './types/easing-logic';\n\n/**\n * An Interface specifying the possible options to be passed into the newInstance() factory method\n */\nexport interface PageScrollOptions extends PageScrollConfig {\n  /**\n   * The document object of the current app\n   */\n  document: Document;\n\n  /**\n   * A specification of the DOM element to scroll to. Either a string referring to an\n   * element using a valid css selector (`#target`, `.class`, `div.class`) or a HTMLElement\n   * that is attached to the document's DOM tree.\n   */\n  scrollTarget: PageScrollTarget;\n\n  /**\n   * Array of HTMLElements or the body object that should be manipulated while performing\n   * the scroll animation.\n   */\n  scrollViews?: PageScrollViews[];\n\n  /**\n   * Maximum speed to be used for the scroll animation. Only taken\n   * into account of no duration is provided\n   */\n  speed?: number;\n\n  /**\n   * A listener to be called whenever the scroll animation stops\n   */\n  scrollFinishListener?: EventEmitter<boolean>;\n\n  namespace?: string;\n  verticalScrolling?: boolean;\n  duration?: number;\n  scrollOffset?: number;\n  advancedInlineOffsetCalculation?: boolean;\n  interruptEvents?: string[];\n  interruptKeys?: string[];\n  interruptible?: boolean;\n  scrollInView?: boolean;\n  easingLogic?: EasingLogic;\n}\n\n/**\n * Represents a scrolling action\n */\nexport class PageScrollInstance {\n\n  public pageScrollOptions: PageScrollOptions;\n\n  private isInlineScrolling: boolean;\n\n  /* The listener that this scroll instance attaches to the body to listen for interrupt events\n  We're keeping a reference to it so we can properly remove it when the animation finishes */\n  private interruptListener: EventListenerOrEventListenerObject;\n\n  /**\n   * These properties will be set/manipulated if the scroll animation starts\n   */\n  /* The initial value of the scrollTop or scrollLeft position when the animation starts */\n  public startScrollPosition = 0;\n  /* The target value of the scrollTop or scrollLeft position for the animation (aka \"the final destination\") */\n  public targetScrollPosition: number;\n  /* Difference between startScrollPosition and targetScrollPosition. Pre-calculated to minimize computations during animation */\n  public distanceToScroll: number;\n  /* The timestamp when the animation starts/got started */\n  public startTime: number;\n  /* The estimate end time of the animation, calculated by startTime + duration */\n  public endTime: number;\n  /* The duration a started animation takes. This may match the _duration or be adjusted due to the _speed option */\n  public executionDuration: number;\n  /* Whether an interrupt listener is attached to the body or not */\n  public interruptListenersAttached = false;\n\n  /* References to the timer instance that is used to perform the scroll animation to be\n   able to clear it on animation end*/\n  public timer = null;\n\n  /**\n   * Private constructor, requires the properties assumed to be the bare minimum.\n   * Use the factory methods to create instances:\n   *      {@link PageScrollService#create}\n   */\n  constructor(pageScrollOptions: PageScrollOptions) {\n    if (!pageScrollOptions.scrollViews || pageScrollOptions.scrollViews.length === 0) {\n      pageScrollOptions.scrollViews = [\n        pageScrollOptions.document.documentElement,\n        pageScrollOptions.document.body,\n        pageScrollOptions.document.body.parentNode,\n      ];\n      this.isInlineScrolling = false;\n    } else {\n      this.isInlineScrolling = true;\n    }\n\n    this.pageScrollOptions = pageScrollOptions;\n  }\n\n  private static getScrollingTargetPosition(pageScrollOptions: PageScrollOptions,\n                                            scrollTargetElement: HTMLElement): { top: number, left: number } {\n    const body = pageScrollOptions.document.body;\n    const docEl = pageScrollOptions.document.documentElement;\n\n    const windowPageYOffset: number = pageScrollOptions.document.defaultView &&\n      pageScrollOptions.document.defaultView.pageYOffset || undefined;\n    const windowPageXOffset: number = pageScrollOptions.document.defaultView &&\n      pageScrollOptions.document.defaultView.pageXOffset || undefined;\n\n    const scrollTop = windowPageYOffset || docEl.scrollTop || body.scrollTop;\n    const scrollLeft = windowPageXOffset || docEl.scrollLeft || body.scrollLeft;\n\n    const clientTop = docEl.clientTop || body.clientTop || 0;\n    const clientLeft = docEl.clientLeft || body.clientLeft || 0;\n\n    if (scrollTargetElement === undefined || scrollTargetElement === null) {\n      // No element found, so return the current position to not cause any change in scroll position\n      return {top: scrollTop, left: scrollLeft};\n    }\n    const box = scrollTargetElement.getBoundingClientRect();\n\n    const top = box.top + scrollTop - clientTop;\n    const left = box.left + scrollLeft - clientLeft;\n\n    return {top: Math.round(top), left: Math.round(left)};\n  }\n\n  private static getInlineScrollingTargetPosition(pageScrollOptions: PageScrollOptions,\n                                                  scrollTargetElement: HTMLElement): { top: number, left: number } {\n    const position = {top: scrollTargetElement.offsetTop, left: scrollTargetElement.offsetLeft};\n    if (pageScrollOptions.advancedInlineOffsetCalculation && pageScrollOptions.scrollViews.length === 1) {\n      const accumulatedParentsPos = {top: 0, left: 0};\n      // not named window to make sure we're not getting the global window variable by accident\n      const theWindow = scrollTargetElement.ownerDocument.defaultView;\n      let parentFound = false;\n\n      // Start parent is the immediate parent\n      let parent = scrollTargetElement.parentElement;\n\n      // Iterate upwards all parents\n      while (!parentFound && parent !== undefined && parent !== null) {\n        if (theWindow.getComputedStyle(parent).getPropertyValue('position') === 'relative') {\n          accumulatedParentsPos.top += parent.offsetTop;\n          accumulatedParentsPos.left += parent.offsetLeft;\n        }\n        // Next iteration\n        parent = parent.parentElement;\n        parentFound = parent === pageScrollOptions.scrollViews[0];\n      }\n      if (parentFound) {\n        // Only use the results if we found the parent, otherwise we accumulated too much anyway\n        position.top += accumulatedParentsPos.top;\n        position.left += accumulatedParentsPos.left;\n      } else {\n        /* TODO Uncomment\n        if (PageScrollConfig._logLevel >= 2 || (PageScrollConfig._logLevel >= 1 && isDevMode())) {\n          console.warn('Unable to find nested scrolling targets parent!');\n        }*/\n      }\n    }\n\n    return position;\n  }\n\n  public getScrollPropertyValue(scrollingView): number {\n    if (!this.pageScrollOptions.verticalScrolling) {\n      return scrollingView.scrollLeft;\n    }\n\n    return scrollingView.scrollTop;\n  }\n\n  public getScrollClientPropertyValue(scrollingView): number {\n    if (!this.pageScrollOptions.verticalScrolling) {\n      return scrollingView.clientWidth;\n    }\n\n    return scrollingView.clientHeight;\n  }\n\n  /**\n   * Extract the exact location of the scrollTarget element.\n   *\n   * Extract the scrollTarget HTMLElement from the given PageScrollTarget object. The latter one may be\n   * a string like \"#heading2\", then this method returns the corresponding DOM element for that id.\n   *\n   */\n  public extractScrollTargetPosition(): { top: number, left: number } {\n    const scrollTargetElement = this.getScrollTargetElement();\n\n    if (scrollTargetElement === null || scrollTargetElement === undefined) {\n      // Scroll target not found\n      return {top: NaN, left: NaN};\n    }\n\n    if (this.isInlineScrolling) {\n      return PageScrollInstance.getInlineScrollingTargetPosition(this.pageScrollOptions, scrollTargetElement);\n    }\n\n    return PageScrollInstance.getScrollingTargetPosition(this.pageScrollOptions, scrollTargetElement);\n  }\n\n  /**\n   * Get the top offset of the scroll animation.\n   * This automatically takes the offset location of the scrolling container/scrolling view\n   * into account (for nested/inline scrolling).\n   */\n  public getCurrentOffset(): number {\n    return this.pageScrollOptions.scrollOffset;\n  }\n\n  /**\n   * Sets the \"scrollTop\" or \"scrollLeft\" property for all scrollViews to the provided value\n   * @return true if at least for one ScrollTopSource the scrollTop/scrollLeft value could be set and it kept the new value.\n   *          false if it failed for all ScrollViews, meaning that we should stop the animation\n   *          (probably because we're at the end of the scrolling region)\n   */\n  public setScrollPosition(position: number): boolean {\n    // Set the new scrollTop/scrollLeft to all scrollViews elements\n    return this.pageScrollOptions.scrollViews.reduce((oneAlreadyWorked, scrollingView: any) => { // eslint-disable-line @typescript-eslint/no-explicit-any\n      const startScrollPropertyValue = this.getScrollPropertyValue(scrollingView);\n      if (scrollingView && startScrollPropertyValue !== undefined && startScrollPropertyValue !== null) {\n        const scrollDistance = Math.abs(startScrollPropertyValue - position);\n\n        // The movement we need to perform is less than 2px\n        // This we consider a small movement which some browser may not perform when\n        // changing the scrollTop/scrollLeft property\n        // Thus in this cases we do not stop the scroll animation, although setting the\n        // scrollTop/scrollLeft value \"fails\"\n        const isSmallMovement = scrollDistance < this.pageScrollOptions._minScrollDistance;\n\n        if (!this.pageScrollOptions.verticalScrolling) {\n          scrollingView.scrollLeft = position;\n        } else {\n          scrollingView.scrollTop = position;\n        }\n\n        // Return true if setting the new scrollTop/scrollLeft value worked\n        // We consider that it worked if the new scrollTop/scrollLeft value is closer to the\n        // desired scrollTop/scrollLeft than before (it might not be exactly the value we\n        // set due to dpi or rounding irregularities)\n        if (isSmallMovement || scrollDistance > Math.abs(this.getScrollPropertyValue(scrollingView) - position)) {\n          return true;\n        }\n      }\n\n      return oneAlreadyWorked;\n    }, false);\n  }\n\n  /**\n   * Trigger firing a animation finish event\n   * @param value Whether the animation finished at the target (true) or got interrupted (false)\n   */\n  public fireEvent(value: boolean): void {\n    if (this.pageScrollOptions.scrollFinishListener) {\n      this.pageScrollOptions.scrollFinishListener.emit(value);\n    }\n  }\n\n  /**\n   * Attach the interrupt listeners to the PageScrollInstance body. The given interruptReporter\n   * will be called if any of the attached events is fired.\n   *\n   * Possibly attached interruptListeners are automatically removed from the body before the new one will be attached.\n   */\n  public attachInterruptListeners(interruptReporter: InterruptReporter): void {\n    if (this.interruptListenersAttached) {\n      // Detach possibly existing listeners first\n      this.detachInterruptListeners();\n    }\n    this.interruptListener = (event: Event): void => {\n      interruptReporter.report(event, this);\n    };\n    this.pageScrollOptions.interruptEvents.forEach(\n      (event: string) => this.pageScrollOptions.document.body.addEventListener(event, this.interruptListener)\n    );\n    this.interruptListenersAttached = true;\n  }\n\n  /**\n   * Remove event listeners from the body and stop listening for events that might be treated as \"animation\n   * interrupt\" events.\n   */\n  public detachInterruptListeners(): void {\n    this.pageScrollOptions.interruptEvents.forEach(\n      (event: string) => this.pageScrollOptions.document.body.removeEventListener(event, this.interruptListener)\n    );\n    this.interruptListenersAttached = false;\n  }\n\n  private getScrollTargetElement(): HTMLElement {\n    if (typeof this.pageScrollOptions.scrollTarget === 'string') {\n      const targetSelector = this.pageScrollOptions.scrollTarget as string;\n      if (targetSelector.match(/^#[^\\s]+$/g) !== null) {\n        // It's an id selector and a valid id, as it does not contain any white space characters\n\n        return this.pageScrollOptions.document.getElementById(targetSelector.substr(1));\n      }\n\n      return this.pageScrollOptions.document.querySelector(targetSelector) as HTMLElement;\n    }\n\n    return this.pageScrollOptions.scrollTarget as HTMLElement;\n  }\n}\n\n/**\n * An Interface a listener should implement to be notified about possible interrupt events\n * that happened due to user interaction while a scroll animation takes place.\n *\n * The PageScrollService provides an implementation to a PageScrollInstance to be notified\n * about scroll animation interrupts and stop related animations.\n */\nexport interface InterruptReporter {\n  report(event: Event, pageScrollInstance: PageScrollInstance): void;\n}\n","import { InjectionToken } from '@angular/core';\nimport { PageScrollConfig } from '../types/page-scroll.config';\n\nexport const NGXPS_CONFIG = new InjectionToken<PageScrollConfig>('ngxps_config');\n\nexport const defaultPageScrollConfig: PageScrollConfig = {\n  _interval: 10,\n  _minScrollDistance: 2,\n  _logLevel: 1,\n  namespace: 'default',\n  verticalScrolling: true,\n  duration: 1250,\n  scrollOffset: 0,\n  advancedInlineOffsetCalculation: false,\n  interruptEvents: ['mousedown', 'wheel', 'DOMMouseScroll', 'mousewheel', 'keyup', 'touchmove'],\n  interruptKeys: [' ', 'Escape', 'Tab', 'Enter', 'PageUp', 'PageDown', 'Home', 'End', 'ArrowUp', 'ArrowRight', 'ArrowLeft', 'ArrowDown'],\n  interruptible: true,\n  scrollInView: true,\n  easingLogic: (t: number, b: number, c: number, d: number): number => {\n    // Linear easing\n    return c * t / d + b;\n  },\n};\n","import { Inject, Injectable, isDevMode } from '@angular/core';\n\nimport { PageScrollConfig } from '../types/page-scroll.config';\nimport { InterruptReporter, PageScrollInstance, PageScrollOptions } from '../page-scroll-instance';\nimport { defaultPageScrollConfig, NGXPS_CONFIG } from './config.provider';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class PageScrollService {\n  private readonly config: PageScrollConfig;\n\n  private runningInstances: PageScrollInstance[] = [];\n\n  private onInterrupted: InterruptReporter = {\n    report: (event: Event, pageScrollInstance: PageScrollInstance): void => {\n      if (!pageScrollInstance.pageScrollOptions.interruptible) {\n        // Non-interruptible anyway, so do not stop anything\n        return;\n      }\n\n      let shouldStop = true;\n\n      if (event.type === 'keyup') {\n        // Only stop if specific keys have been pressed, for all others don't stop anything\n        if (this.config.interruptKeys.indexOf((event as KeyboardEvent).key) === -1) {\n          // The pressed key is not in the list of interrupting keys\n          shouldStop = false;\n        }\n      } else if (event.type === 'mousedown') {\n        // For mousedown events we only stop the scroll animation of the mouse has\n        // been clicked inside the scrolling container\n        if (!pageScrollInstance.pageScrollOptions.scrollViews.some(scrollingView => scrollingView.contains(event.target as Node))) {\n          // Mouse clicked an element which is not inside any of the the scrolling containers\n          shouldStop = false;\n        }\n      }\n\n      if (shouldStop) {\n        this.stopAll(pageScrollInstance.pageScrollOptions.namespace);\n      }\n    },\n  };\n\n  private stopInternal(interrupted: boolean, pageScrollInstance: PageScrollInstance): boolean {\n    const index: number = this.runningInstances.indexOf(pageScrollInstance);\n    if (index >= 0) {\n      this.runningInstances.splice(index, 1);\n    }\n\n    if (pageScrollInstance.interruptListenersAttached) {\n      pageScrollInstance.detachInterruptListeners();\n    }\n\n    if (pageScrollInstance.timer) {\n      // Clear/Stop the timer\n      clearInterval(pageScrollInstance.timer);\n      // Clear the reference to this timer\n      pageScrollInstance.timer = undefined;\n      pageScrollInstance.fireEvent(!interrupted);\n\n      return true;\n    }\n\n    return false;\n  }\n\n  public create(options: PageScrollOptions): PageScrollInstance {\n    return new PageScrollInstance({...this.config, ...options} as PageScrollOptions);\n  }\n\n  /**\n   * Start a scroll animation. All properties of the animation are stored in the given {@link PageScrollInstance} object.\n   *\n   * This is the core functionality of the whole library.\n   */\n  // tslint:disable-next-line:cyclomatic-complexity\n  public start(pageScrollInstance: PageScrollInstance): void {\n    // Merge the default options in the pageScrollInstance options\n    pageScrollInstance.pageScrollOptions = {...this.config, ...pageScrollInstance.pageScrollOptions} as PageScrollOptions;\n\n    // Stop all possibly running scroll animations in the same namespace\n    this.stopAll(pageScrollInstance.pageScrollOptions.namespace);\n\n    if (pageScrollInstance.pageScrollOptions.scrollViews === null || pageScrollInstance.pageScrollOptions.scrollViews.length === 0) {\n      // No scrollViews specified, thus we can't animate anything\n      if (this.config._logLevel >= 2 || (this.config._logLevel >= 1 && isDevMode())) {\n        console.warn('No scrollViews specified, thus ngx-page-scroll does not know which DOM elements to scroll');\n      }\n\n      return;\n    }\n\n    let startScrollPositionFound = false;\n    let scrollRange = pageScrollInstance.getScrollClientPropertyValue(pageScrollInstance.pageScrollOptions.scrollViews[0]);\n    // Reset start scroll position to 0. If any of the scrollViews has a different one, it will be extracted next\n    pageScrollInstance.startScrollPosition = 0;\n\n    // Get the start scroll position from the scrollViews (e.g. if the user already scrolled down the content)\n    pageScrollInstance.pageScrollOptions.scrollViews.forEach(scrollingView => {\n      if (scrollingView === undefined || scrollingView === null) {\n        return;\n      }\n      // Get the scrollTop or scrollLeft value of the first scrollingView that returns a value for its \"scrollTop\"\n      // or \"scrollLeft\" property that is not undefined and unequal to 0\n\n      const scrollPosition = pageScrollInstance.getScrollPropertyValue(scrollingView);\n      if (!startScrollPositionFound && scrollPosition) {\n        // We found a scrollingView that does not have scrollTop or scrollLeft 0\n\n        // Return the scroll position value, as this will be our startScrollPosition\n        pageScrollInstance.startScrollPosition = scrollPosition;\n        startScrollPositionFound = true;\n\n        // Remember te scrollRange of this scrollingView\n        scrollRange = pageScrollInstance.getScrollClientPropertyValue(scrollingView);\n      }\n    });\n\n    const pageScrollOffset = pageScrollInstance.getCurrentOffset();\n\n    // Calculate the target position that the scroll animation should go to\n\n    const scrollTargetPosition = pageScrollInstance.extractScrollTargetPosition();\n    pageScrollInstance.targetScrollPosition = Math.round(\n      (pageScrollInstance.pageScrollOptions.verticalScrolling ? scrollTargetPosition.top : scrollTargetPosition.left) - pageScrollOffset);\n\n    // Calculate the distance we need to go in total\n    pageScrollInstance.distanceToScroll = pageScrollInstance.targetScrollPosition - pageScrollInstance.startScrollPosition;\n\n    if (isNaN(pageScrollInstance.distanceToScroll)) {\n      // We weren't able to find the target position, maybe the element does not exist?\n\n      if (this.config._logLevel >= 2 || (this.config._logLevel >= 1 && isDevMode())) {\n        console.log('Scrolling not possible, as we can\\'t find the specified target');\n      }\n      pageScrollInstance.fireEvent(false);\n\n      return;\n    }\n\n    // We're at the final destination already\n    // OR we need to scroll down but are already at the end\n    // OR we need to scroll up but are at the top already\n    const allReadyAtDestination = Math.abs(pageScrollInstance.distanceToScroll) < pageScrollInstance.pageScrollOptions._minScrollDistance;\n\n    // Check how long we need to scroll if a speed option is given\n    // Default executionDuration is the specified duration\n    pageScrollInstance.executionDuration = pageScrollInstance.pageScrollOptions.duration;\n    // Maybe we need to pay attention to the speed option?\n    if ((pageScrollInstance.pageScrollOptions.speed !== undefined && pageScrollInstance.pageScrollOptions.speed !== null) &&\n      (pageScrollInstance.pageScrollOptions.duration === undefined || pageScrollInstance.pageScrollOptions.duration === null)) {\n      // Speed option is set and no duration => calculate duration based on speed and scroll distance\n      pageScrollInstance.executionDuration =\n        Math.abs(pageScrollInstance.distanceToScroll) / pageScrollInstance.pageScrollOptions.speed * 1000;\n    }\n\n    // We should go there directly, as our \"animation\" would have one big step\n    // only anyway and this way we save the interval stuff\n    const tooShortInterval = pageScrollInstance.executionDuration <= pageScrollInstance.pageScrollOptions._interval;\n\n    if (allReadyAtDestination || tooShortInterval) {\n      if (this.config._logLevel >= 2 || (this.config._logLevel >= 1 && isDevMode())) {\n        if (allReadyAtDestination) {\n          console.log('Scrolling not possible, as we can\\'t get any closer to the destination');\n        } else {\n          console.log('Scroll duration shorter that interval length, jumping to target');\n        }\n      }\n      pageScrollInstance.setScrollPosition(pageScrollInstance.targetScrollPosition);\n      pageScrollInstance.fireEvent(true);\n\n      return;\n    }\n\n    if (!pageScrollInstance.pageScrollOptions.scrollInView) {\n      const alreadyInView = pageScrollInstance.targetScrollPosition > pageScrollInstance.startScrollPosition &&\n        pageScrollInstance.targetScrollPosition <= pageScrollInstance.startScrollPosition + scrollRange;\n      if (alreadyInView) {\n        if (this.config._logLevel >= 2 || (this.config._logLevel >= 1 && isDevMode())) {\n          console.log('Not scrolling, as target already in view');\n        }\n        pageScrollInstance.fireEvent(true);\n\n        return;\n      }\n    }\n\n    // Register the interrupt listeners if we want an interruptible scroll animation\n    if (pageScrollInstance.pageScrollOptions.interruptible) {\n      pageScrollInstance.attachInterruptListeners(this.onInterrupted);\n    }\n\n    // Let's get started, get the start time...\n    pageScrollInstance.startTime = new Date().getTime();\n    // .. and calculate the end time (when we need to finish at last)\n    pageScrollInstance.endTime = pageScrollInstance.startTime + pageScrollInstance.executionDuration;\n\n    pageScrollInstance.timer = setInterval((instance: PageScrollInstance) => {\n      // Take the current time\n      const currentTime: number = new Date().getTime();\n\n      // Determine the new scroll position\n      let newScrollPosition: number;\n      let stopNow = false;\n      if (instance.endTime <= currentTime) {\n        // We're over the time already, so go the targetScrollPosition (aka destination)\n        newScrollPosition = instance.targetScrollPosition;\n        stopNow = true;\n      } else {\n        // Calculate the scroll position based on the current time using the easing function\n        newScrollPosition = Math.round(instance.pageScrollOptions.easingLogic(\n          currentTime - instance.startTime,\n          instance.startScrollPosition,\n          instance.distanceToScroll,\n          instance.executionDuration));\n      }\n      if (this.config._logLevel >= 5 && isDevMode()) {\n        console.warn('Scroll Position: ' + newScrollPosition);\n      }\n      // Set the new scrollPosition to all scrollViews elements\n      if (!instance.setScrollPosition(newScrollPosition)) {\n        // Setting the new scrollTop/scrollLeft value failed for all ScrollViews\n        // early stop the scroll animation to save resources\n        stopNow = true;\n      }\n\n      // At the end do the internal stop maintenance and fire the pageScrollFinish event\n      // (otherwise the event might arrive at \"too early\")\n      if (stopNow) {\n        this.stopInternal(false, instance);\n      }\n\n    }, this.config._interval, pageScrollInstance);\n\n    // Register the instance as running one\n    this.runningInstances.push(pageScrollInstance);\n  }\n\n  public scroll(options: PageScrollOptions): void {\n    this.start(this.create(options));\n  }\n\n  /**\n   * Stop all running scroll animations. Optionally limit to stop only the ones of specific namespace.\n   */\n  public stopAll(namespace?: string): boolean {\n    if (this.runningInstances.length > 0) {\n      let stoppedSome = false;\n\n      for (let i = 0; i < this.runningInstances.length; ++i) {\n        const pageScrollInstance = this.runningInstances[i];\n        if (!namespace || pageScrollInstance.pageScrollOptions.namespace === namespace) {\n          stoppedSome = true;\n          this.stopInternal(true, pageScrollInstance);\n          // Decrease the counter, as we removed an item from the array we iterate over\n          i--;\n        }\n      }\n\n      return stoppedSome;\n    }\n\n    return false;\n  }\n\n  public stop(pageScrollInstance: PageScrollInstance): boolean {\n    return this.stopInternal(true, pageScrollInstance);\n  }\n\n  constructor(@Inject(NGXPS_CONFIG) customConfig: PageScrollConfig) {\n    this.config = {...defaultPageScrollConfig, ...customConfig};\n  }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { PageScrollService } from './providers/ngx-page-scroll.service';\nimport { NGXPS_CONFIG } from './providers/config.provider';\nimport { PageScrollConfig } from './types/page-scroll.config';\n\n@NgModule({\n  providers: [\n    PageScrollService,\n    {provide: NGXPS_CONFIG, useValue: {}},\n  ],\n})\nexport class NgxPageScrollCoreModule {\n  static forRoot(config?: PageScrollConfig): ModuleWithProviders<NgxPageScrollCoreModule> {\n    return {\n      ngModule: NgxPageScrollCoreModule,\n      providers: [PageScrollService, {provide: NGXPS_CONFIG, useValue: config}],\n    };\n  }\n}\n","/*\n * Public API Surface of ngx-page-scroll-core\n */\n\nexport { NgxPageScrollCoreModule } from './lib/ngx-page-scroll-core.module';\n\nexport { defaultPageScrollConfig, NGXPS_CONFIG } from './lib/providers/config.provider';\nexport { PageScrollService } from './lib/providers/ngx-page-scroll.service';\n\nexport { EasingLogic } from './lib/types/easing-logic';\nexport { PageScrollInstance, InterruptReporter, PageScrollOptions } from './lib/page-scroll-instance';\nexport { PageScrollTarget } from './lib/types/page-scroll-target';\nexport { PageScrollViews } from './lib/types/page-scroll-view';\nexport { PageScrollConfig } from './lib/types/page-scroll.config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}