{"version":3,"file":"enten-ngx-sticky.mjs","sources":["../src/lib/utils/collections.ts","../src/lib/sticky-base-container.controller.ts","../src/lib/utils/coercion.ts","../src/lib/utils/input-subject.ts","../src/lib/utils/config-subject.ts","../src/lib/utils/dom.ts","../src/lib/sticky.helpers.ts","../src/lib/sticky-engine.ts","../src/lib/sticky-base-container.directive.ts","../src/lib/sticky.tokens.ts","../src/lib/sticky-root-container.controller.ts","../src/lib/sticky-container.directive.ts","../src/lib/utils/intersection.ts","../src/lib/in-viewport.directive.ts","../src/lib/sticky-base-boundary.controller.ts","../src/lib/sticky-base.controller.ts","../src/lib/sticky-boundary.directive.ts","../src/lib/utils/from-image-events.ts","../src/lib/utils/from-media-query.ts","../src/lib/sticky-spot.directive.ts","../src/lib/sticky.directive.ts","../src/lib/sticky.module.ts","../src/public-api.ts","../src/enten-ngx-sticky.ts"],"sourcesContent":["\r\n\r\n/**\r\n * Add entry into set.\r\n *\r\n * @param set Array list\r\n * @param entry Entry to add\r\n * @returns Entry index added\r\n */\r\nexport function addEntry<T>(set: T[], entry: T): number {\r\n  let entryIndex = set.indexOf(entry);\r\n\r\n  if (entryIndex === -1) {\r\n    entryIndex = set.length;\r\n\r\n    set[entryIndex] = entry;\r\n  }\r\n\r\n  return entryIndex;\r\n}\r\n\r\n\r\n/**\r\n * Delete entry from set.\r\n *\r\n * @param set Array list\r\n * @param entry Entry to delete\r\n * @returns Entry index deleted\r\n */\r\nexport function deleteEntry<T>(set: T[], entry: T): number {\r\n  const entryIndex = set.indexOf(entry);\r\n\r\n  if (entryIndex !== -1) {\r\n    set.splice(entryIndex, 1);\r\n  }\r\n\r\n  return entryIndex;\r\n}\r\n","import { NgxStickyEngine } from './sticky-engine';\r\nimport {\r\n  NgxIntersectionComputation,\r\n  NgxIntersectionController,\r\n  NgxIntersectionSnap,\r\n  NgxScrollPlan,\r\n  NgxSticky,\r\n  NgxStickyBoundaryController,\r\n  NgxStickyComputation,\r\n  NgxStickyContainer,\r\n  NgxStickyContainerController,\r\n  NgxStickyController,\r\n  NgxStickyPosition,\r\n  NgxStickySnap,\r\n} from './sticky.types';\r\nimport { addEntry, deleteEntry } from './utils/collections';\r\n\r\n\r\n/**\r\n * Abstract sticky container controller.\r\n */\r\nexport abstract class NgxStickyBaseContainerController implements NgxStickyContainerController {\r\n  abstract readonly containerParent?: NgxStickyContainerController;\r\n  abstract readonly stickyEngine: NgxStickyEngine;\r\n\r\n  abstract disabled: boolean;\r\n\r\n  readonly boundaries: NgxStickyBoundaryController[] = [];\r\n  readonly containers: NgxStickyContainerController[] = [];\r\n  readonly intersections: NgxIntersectionController[] = [];\r\n  readonly stickies: NgxStickyController[] = [];\r\n\r\n  readonly _stickyComputations: Record<number, NgxStickyComputation> = {};\r\n  readonly _stickySnaps: Record<number, NgxStickySnap> = {};\r\n  _stickySnapContainerHeight!: number;\r\n\r\n  readonly _intersectionComputations: Record<number, NgxIntersectionComputation> = {};\r\n  readonly _intersectionSnaps: Record<number, NgxIntersectionSnap> = {};\r\n\r\n  abstract beforeRefresh(fastUpdate?: boolean): void;\r\n  /** @deprecated */\r\n  abstract createScrollPlan(element: number | string | HTMLElement, extraOffsetTop: number): NgxScrollPlan;\r\n  abstract createScrollPlan(\r\n    element: number | string | HTMLElement,\r\n    options?: { excludeStickies?: boolean; extraOffsetTop?: number; },\r\n  ): NgxScrollPlan;\r\n  abstract disableStickies(): void;\r\n  abstract enableStickies(): void;\r\n  abstract getContainer(): NgxStickyContainer;\r\n  abstract getViewportHeight(): number;\r\n  abstract getViewportLeft(): number;\r\n  abstract getViewportTop(): number;\r\n  /** @deprecated */\r\n  abstract scrollToTop(target: number | string | HTMLElement, extraOffsetTop: number): void;\r\n  abstract scrollToTop(\r\n    target: number | string | HTMLElement,\r\n    options?: { excludeStickies?: boolean; extraOffsetTop?: number; },\r\n  ): void;\r\n\r\n  abstract _computeContainer(): NgxStickyContainer;\r\n\r\n  disableAllStickies(): void {\r\n    this.disableStickies();\r\n\r\n    for (const container of this.containers) {\r\n      container.disableStickies();\r\n    }\r\n  }\r\n\r\n  enableAllStickies(): void {\r\n    this.enableStickies();\r\n\r\n    for (const container of this.containers) {\r\n      container.enableStickies();\r\n    }\r\n  }\r\n\r\n  getStickedOffset(position: NgxStickyPosition, viewportTop: number): number {\r\n    const container = this.getContainer();\r\n    const viewportHeight = this.getViewportHeight();\r\n    const stickies = this.stickies.map(stickyController => stickyController.getSticky());\r\n    const stickySnaps = this.stickyEngine._collectStickySnaps(container, stickies, position, viewportHeight);\r\n    return this.stickyEngine.determineStickedOffset(container, stickySnaps, position, viewportTop);\r\n  }\r\n\r\n  fixViewportTop(\r\n    viewportTop: number,\r\n    optionsOrExtraOffsetTop?: { excludeStickies?: boolean; extraOffsetTop?: number; } | number,\r\n  ): number {\r\n    const options = typeof optionsOrExtraOffsetTop === 'number' ? { extraOffsetTop: optionsOrExtraOffsetTop } : optionsOrExtraOffsetTop;\r\n    const viewportHeight = this.getViewportHeight();\r\n    const viewportTopOffsetless = viewportTop - (options?.extraOffsetTop || 0);\r\n    let stickedOffsetTop = 0;\r\n\r\n    if (!options?.excludeStickies) {\r\n      const container = this.getContainer();\r\n      const stickies = this.stickies.map(stickyController => stickyController.getSticky());\r\n      const stickySnaps = this.stickyEngine._collectStickySnaps(container, stickies, 'top', viewportHeight);\r\n      // determine offset top height for the given viewport top\r\n      const initialViewportTop = viewportTopOffsetless;\r\n      const initialStickedOffset = this.stickyEngine.determineStickedOffset(container, stickySnaps, 'top', initialViewportTop);\r\n      // determine offset top height for the given viewport subtracted by the offset top height\r\n      let lastViewportTop = initialViewportTop - initialStickedOffset;\r\n      let lastStickedOffset = initialStickedOffset && this.stickyEngine.determineStickedOffset(container, stickySnaps, 'top', lastViewportTop);\r\n\r\n      // if both calculated heights are equal means that subtracting offset top height from\r\n      // the given viewport is enought\r\n      if (lastStickedOffset === initialStickedOffset) {\r\n        stickedOffsetTop = lastStickedOffset;\r\n      } else {\r\n        // else we have to scroll up pixel by pixel to compute the best viewport top position\r\n        const initialStickedOffsetMinusViewportHeight = initialViewportTop - viewportHeight;\r\n        for (\r\n          lastViewportTop = initialViewportTop - 1;\r\n          lastViewportTop >= initialStickedOffsetMinusViewportHeight;\r\n          lastViewportTop--\r\n        ) {\r\n          lastStickedOffset = this.stickyEngine.determineStickedOffset(container, stickySnaps, 'top', lastViewportTop);\r\n          if (initialViewportTop - lastViewportTop - lastStickedOffset >= 0) {\r\n            stickedOffsetTop = initialViewportTop - lastViewportTop;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    let viewportTopFixed = viewportTopOffsetless - stickedOffsetTop;\r\n\r\n    if (this.containerParent) {\r\n      viewportTopFixed -= this.getContainer().top;\r\n    }\r\n\r\n    return viewportTopFixed;\r\n  }\r\n\r\n  registerContainer(containerController: NgxStickyContainerController): void {\r\n    addEntry(this.containers, containerController);\r\n  }\r\n\r\n  registerBoundary(boundaryController: NgxStickyBoundaryController): void {\r\n    addEntry(this.boundaries, boundaryController);\r\n  }\r\n\r\n  registerIntersection(intersectionController: NgxIntersectionController): void {\r\n    const intersectionIndex = addEntry(this.intersections, intersectionController);\r\n\r\n    if (intersectionIndex !== -1) {\r\n      this._intersectionSnaps[intersectionIndex] = null!;\r\n      this._intersectionComputations[intersectionIndex] = null!;\r\n    }\r\n  }\r\n\r\n  registerSticky(stickyController: NgxStickyController): void {\r\n    const stickyIndex = addEntry(this.stickies, stickyController);\r\n\r\n    if (stickyIndex !== -1) {\r\n      this._stickySnaps[stickyIndex] = null!;\r\n      this._stickyComputations[stickyIndex] = null!;\r\n    }\r\n  }\r\n\r\n  updateAllStickies(fastUpdate?: boolean): void {\r\n    this.updateStickies(fastUpdate);\r\n\r\n    for (const containerController of this.containers) {\r\n      containerController.updateAllStickies(fastUpdate);\r\n    }\r\n  }\r\n\r\n  updateStickies(fastUpdate?: boolean): void {\r\n    // // avoid update when there is no stickies\r\n    // if (!this.stickies.length) {\r\n    //   return;\r\n    // }\r\n\r\n    // // force full update when container size change\r\n    // if (this.getContainerHeight() !== this._stickySnapContainerHeight) {\r\n    //   fastUpdate = false;\r\n    // }\r\n\r\n    // get container viewport top before any update\r\n    const containerViewportTop = this.getViewportTop();\r\n\r\n    if (!fastUpdate) {\r\n      this.beforeRefresh(fastUpdate);\r\n\r\n      for (const boundaryController of this.boundaries) {\r\n        boundaryController.beforeRefresh(fastUpdate);\r\n      }\r\n\r\n      for (let stickyIndex = 0; stickyIndex < this.stickies.length; ++stickyIndex) {\r\n        this._stickyComputations[stickyIndex] = null!;\r\n        this._stickySnaps[stickyIndex] = null!;\r\n\r\n        this.stickies[stickyIndex].beforeRefresh(fastUpdate);\r\n      }\r\n\r\n      for (let intersectionIndex = 0; intersectionIndex < this.intersections.length; ++intersectionIndex) {\r\n        this._intersectionComputations[intersectionIndex] = null!;\r\n        this._intersectionSnaps[intersectionIndex] = null!;\r\n\r\n        this.intersections[intersectionIndex].beforeRefresh(fastUpdate);\r\n      }\r\n    }\r\n\r\n    //   // legacy code\r\n    //   const viewportHeight = this.getViewportHeight() - this.stickyOffsetTop - this.stickyOffsetBottom;\r\n    //   const viewportTop = containerViewportTop + this.getContainer().top + this.stickyOffsetTop;\r\n\r\n    const container = this.getContainer();\r\n    const viewportHeight = this.getViewportHeight();\r\n    // compute absolute viewport top\r\n    const viewportTop = containerViewportTop + this.getContainer().top;\r\n    let stickies!: NgxSticky[];\r\n\r\n    // refresh stickies\r\n    for (let stickyIndex = 0; stickyIndex < this.stickies.length; ++stickyIndex) {\r\n      const stickyController = this.stickies[stickyIndex];\r\n      let stickyComputation = this._stickyComputations[stickyIndex];\r\n\r\n      if (!stickyComputation || stickyComputation.viewportTop !== viewportTop) {\r\n        let stickySnap = this._stickySnaps[stickyIndex];\r\n\r\n        if (!stickySnap) {\r\n          if (!stickies) {\r\n            stickies = [];\r\n            for (const _stickyController of this.stickies) {\r\n              stickies.push(_stickyController.getSticky());\r\n            }\r\n          }\r\n\r\n          stickySnap = this.stickyEngine.snapSticky(container, stickies, stickies[stickyIndex], viewportHeight);\r\n\r\n          this._stickySnaps[stickyIndex] = stickySnap;\r\n        }\r\n\r\n        stickyComputation = this.stickyEngine.determineStickyState(stickySnap, viewportTop);\r\n\r\n        this._stickyComputations[stickyIndex] = stickyComputation;\r\n      }\r\n\r\n      stickyController.refresh(stickyComputation);\r\n    }\r\n\r\n    // refresh intersections\r\n    for (let intersectionIndex = 0; intersectionIndex < this.intersections.length; ++intersectionIndex) {\r\n      const intersectionController = this.intersections[intersectionIndex];\r\n      let intersectionComputation = this._intersectionComputations[intersectionIndex];\r\n\r\n      if (!intersectionComputation || intersectionComputation.viewportTop !== viewportTop) {\r\n        let intersectionSnap = this._intersectionSnaps[intersectionIndex];\r\n\r\n        if (!intersectionSnap) {\r\n          if (!stickies) {\r\n            stickies = [];\r\n            for (const _stickyController of this.stickies) {\r\n              stickies.push(_stickyController.getSticky());\r\n            }\r\n          }\r\n\r\n          const intersection = intersectionController.getIntersection();\r\n\r\n          intersectionSnap = this.stickyEngine.snapIntersection(container, stickies, intersection, viewportHeight);\r\n\r\n          this._intersectionSnaps[intersectionIndex] = intersectionSnap;\r\n        }\r\n\r\n        intersectionComputation = this.stickyEngine.determineIntersectionState(intersectionSnap, viewportTop);\r\n\r\n        this._intersectionComputations[intersectionIndex] = intersectionComputation;\r\n      }\r\n\r\n      intersectionController.refresh(intersectionComputation);\r\n    }\r\n\r\n    if (!fastUpdate) {\r\n      // restore container viewport top after full update\r\n      this.scrollToTop(containerViewportTop, { excludeStickies: true });\r\n    }\r\n  }\r\n\r\n  unregisterContainer(container: NgxStickyContainerController): void {\r\n    deleteEntry(this.containers, container);\r\n  }\r\n\r\n  unregisterBoundary(boundary: NgxStickyBoundaryController): void {\r\n    deleteEntry(this.boundaries, boundary);\r\n  }\r\n\r\n  unregisterIntersection(intersectionController: NgxIntersectionController): void {\r\n    const intersectionIndex = deleteEntry(this.intersections, intersectionController);\r\n\r\n    if (intersectionIndex !== -1) {\r\n      this._intersectionSnaps[intersectionIndex] = null!;\r\n      this._intersectionComputations[intersectionIndex] = null!;\r\n    }\r\n  }\r\n\r\n  unregisterSticky(sticky: NgxStickyController): void {\r\n    const stickyIndex = deleteEntry(this.stickies, sticky);\r\n\r\n    if (stickyIndex !== -1) {\r\n      this._stickySnaps[stickyIndex] = null!;\r\n      this._stickyComputations[stickyIndex] = null!;\r\n    }\r\n  }\r\n}\r\n","/**\r\n * @license\r\n * Copyright Google LLC All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\n\r\n/** Coerces a data-bound value (typically a string) to a boolean. */\r\nexport function coerceBooleanProperty(value: any): boolean {\r\n  return value != null && `${value}` !== 'false';\r\n}\r\n\r\n\r\n/** Coerces a data-bound value (typically a string) to a number. */\r\nexport function coerceNumberProperty(value: any): number;\r\nexport function coerceNumberProperty<D>(value: any, fallback: D): number | D;\r\nexport function coerceNumberProperty(value: any, fallbackValue = 0) {\r\n  return _isNumberValue(value) ? Number(value) : fallbackValue;\r\n}\r\n\r\n/**\r\n * Whether the provided value is considered a number.\r\n * @docs-private\r\n */\r\nexport function _isNumberValue(value: any): boolean {\r\n  // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\r\n  // and other non-number values as NaN, where Number just uses 0) but it considers the string\r\n  // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\r\n  return !isNaN(parseFloat(value)) && !isNaN(Number(value));\r\n}\r\n","import { Subject } from 'rxjs';\r\n\r\n\r\nexport type InputCoercionFn<T> = (value: T) => T;\r\n\r\nexport interface InputSubjectNextOptions {\r\n  skipCoercion?: boolean;\r\n}\r\n\r\nexport interface InputSubjectChange<T> {\r\n  previousValue: T;\r\n  currentValue: T;\r\n  firstChange: boolean;\r\n}\r\n\r\n\r\n/**\r\n * An InputSubject is an Observable that coerces values and emit when change is detected.\r\n */\r\nexport class InputSubject<T> extends Subject<T> {\r\n  /** Emit value changes */\r\n  readonly change$ = new Subject<InputSubjectChange<T>>();\r\n\r\n  _firstChange = true;\r\n  _value: T;\r\n  _valueSetted!: T;\r\n\r\n  constructor(\r\n    readonly defaultValue: T,\r\n    readonly coercion?: InputCoercionFn<T>,\r\n  ) {\r\n    super();\r\n\r\n    this._value = defaultValue;\r\n  }\r\n\r\n  /**\r\n   * Returns current value.\r\n   */\r\n  getValue(): T {\r\n    return this._value;\r\n  }\r\n\r\n  /**\r\n   * Emit next value.\r\n   *\r\n   * @param value Next value\r\n   * @param options Options to skip coercion\r\n   */\r\n  override next(value?: T, options?: InputSubjectNextOptions): void {\r\n    if (!options || !options.skipCoercion) {\r\n      if (value === this._valueSetted) {\r\n        return;\r\n      }\r\n\r\n      this._valueSetted = value as T;\r\n\r\n      if (this.coercion) {\r\n        value = this.coercion(value as T);\r\n      }\r\n    }\r\n\r\n    if (value !== this._value) {\r\n      const firstChange = this._firstChange;\r\n      const previousValue = this._value;\r\n\r\n      this._firstChange = false;\r\n      this._value = value as T;\r\n\r\n      this.change$.next({\r\n        previousValue,\r\n        currentValue: value as T,\r\n        firstChange,\r\n      });\r\n\r\n      super.next(value as T);\r\n    }\r\n  }\r\n}\r\n","import { Subject, Subscription } from 'rxjs';\r\n\r\nimport { InputCoercionFn, InputSubject, InputSubjectChange, InputSubjectNextOptions } from './input-subject';\r\n\r\n\r\nexport type ConfigInputSubjects<T> = { [K in keyof T]: InputSubject<T[K]> };\r\nexport type ConfigSubjectChanges<T> = { [K in keyof T]: InputSubjectChange<T[K]> };\r\nexport type ConfigSubjectSchema<T> = { [K in keyof T]: ConfigSubjectInputOptions<T, K> };\r\n\r\nexport interface ConfigSubjectInputOptions<T, K extends keyof T> {\r\n  defaultValue: T[K];\r\n  aliasKey?: string;\r\n  coercion?: InputCoercionFn<T[K]>;\r\n}\r\n\r\n\r\n/**\r\n * A ConfigSubject is an Observable that coerces key-values and emit when change is detected\r\n */\r\nexport class ConfigSubject<T extends object> extends Subject<T> {\r\n  /** Emit key-values changes */\r\n  readonly changes$ = new Subject<ConfigSubjectChanges<T>>();\r\n  /** Input subjects for each config key-value */\r\n  readonly inputs: ConfigInputSubjects<T>;\r\n\r\n  _config: T;\r\n  _configChanged!: boolean;\r\n  _configChanges!: ConfigSubjectChanges<T>;\r\n\r\n  readonly _aliases: { [key: string]: keyof T };\r\n\r\n  readonly _pushChangesSubscription = new Subscription();\r\n\r\n  constructor(schema: ConfigSubjectSchema<T>) {\r\n    super();\r\n\r\n    this.inputs = {} as ConfigInputSubjects<T>;\r\n    this._config = {} as T;\r\n    this._configChanges = {} as ConfigSubjectChanges<T>;\r\n    this._aliases = {};\r\n\r\n    const inputKeys = Object.keys(schema) as (keyof T)[];\r\n\r\n    for (const inputKey of inputKeys) {\r\n      const inputOptions = schema[inputKey];\r\n\r\n      if (inputOptions.aliasKey) {\r\n        this._aliases[inputOptions.aliasKey] = inputKey;\r\n      }\r\n\r\n      const input = new InputSubject<T[keyof T]>(inputOptions.defaultValue, inputOptions.coercion);\r\n\r\n      this._config[inputKey] = inputOptions.defaultValue;\r\n      this.inputs[inputKey] = input;\r\n\r\n      const pushChangeSubscription = input.change$.subscribe(inputChange => {\r\n        this._configChanged = true;\r\n        this._configChanges[inputKey] = inputChange;\r\n\r\n        this._config = { ...this._config };\r\n        this._config[inputKey] = inputChange.currentValue;\r\n      });\r\n\r\n      this._pushChangesSubscription.add(pushChangeSubscription);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns current config.\r\n   */\r\n  getValue(): T {\r\n    return this._config;\r\n  }\r\n\r\n  /**\r\n   * Returns key-value.\r\n   *\r\n   * @param inputKey Input key\r\n   * @returns key-value\r\n   */\r\n  getKeyValue<K extends keyof T>(inputKey: K): T[K] {\r\n    return this._config[inputKey];\r\n  }\r\n\r\n  /**\r\n   * Emit next config.\r\n   *\r\n   * @param partialConfig Partial next config\r\n   * @param options Options to skip coercion\r\n   */\r\n  override next(partialConfig: T, options?: InputSubjectNextOptions): void {\r\n    const inputKeys = Object.keys(partialConfig as Partial<T>) as (keyof T)[];\r\n\r\n    for (const key of inputKeys) {\r\n      const inputKey = (this._aliases[key as string] || key) as keyof T;\r\n\r\n      if (inputKey in this.inputs) {\r\n        const inputValue = (partialConfig)[key] as T[keyof T];\r\n        const inputSubject = this.inputs[inputKey];\r\n\r\n        inputSubject.next(inputValue, options);\r\n      }\r\n    }\r\n\r\n    if (this._configChanged) {\r\n      const changes = { ...this._configChanges };\r\n\r\n      this._configChanged = false;\r\n      this._configChanges = {} as ConfigSubjectChanges<T>;\r\n\r\n      this.changes$.next(changes);\r\n\r\n      super.next(this._config);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit next key-value.\r\n   *\r\n   * @param inputKey Input key\r\n   * @param value key-value\r\n   * @param options Options to skip coercion\r\n   */\r\n  nextKeyValue<K extends keyof T>(inputKey: K, value: T[K], options?: InputSubjectNextOptions): void {\r\n    this.next({ [inputKey]: value } as T, options);\r\n  }\r\n\r\n  /**\r\n   * Apply simple changes as like ngOnChange(changes: SimpleChanges) input.\r\n   *\r\n   * @param changes Simple changes\r\n   */\r\n  nextChanges<K extends keyof T>(changes: Record<K, { currentValue: T[K] }> | Record<string, { currentValue: any }>): void {\r\n    const changeKeys = Object.keys(changes) as (keyof T)[];\r\n    const config: Partial<T> = {};\r\n\r\n    for (const inputKey of changeKeys) {\r\n      config[inputKey] = changes[inputKey as K].currentValue;\r\n    }\r\n\r\n    this.next(config as T);\r\n  }\r\n}\r\n","import { Renderer2 } from '@angular/core';\r\n\r\n\r\n/**\r\n * Returns getter for document height.\r\n *\r\n * @param win Window reference\r\n * @returns Getter for document height.\r\n */\r\nexport function getDocumentHeightFactory(win: Window): () => number {\r\n  if (!win) {\r\n    return () => 0;\r\n  }\r\n\r\n  const documentHeightGetters = [\r\n    () => win.document.body.scrollHeight,\r\n    () => win.document.documentElement.scrollHeight,\r\n    () => win.document.body.offsetHeight,\r\n    () => win.document.documentElement.offsetHeight,\r\n    () => win.document.body.clientHeight,\r\n    () => win.document.documentElement.clientHeight,\r\n  ];\r\n\r\n  let documentHeightGetter = documentHeightGetters[0];\r\n  let documentHeight = 0;\r\n\r\n  for (const _documentHeightGetter of documentHeightGetters) {\r\n    const _documentHeight = _documentHeightGetter();\r\n\r\n    if (_documentHeight > documentHeight) {\r\n      documentHeightGetter = _documentHeightGetter;\r\n      documentHeight = _documentHeight;\r\n    }\r\n  }\r\n\r\n  return documentHeightGetter;\r\n}\r\n\r\n\r\n/**\r\n * Returns getter for document width.\r\n *\r\n * @param win Window reference\r\n * @returns Getter for document width.\r\n */\r\nexport function getDocumentWidthFactory(win: Window): () => number {\r\n  if (!win) {\r\n    return () => 0;\r\n  }\r\n\r\n  const documentWidthGetters = [\r\n    () => win.document.body.scrollWidth,\r\n    () => win.document.documentElement.scrollWidth,\r\n    () => win.document.body.offsetWidth,\r\n    () => win.document.documentElement.offsetWidth,\r\n    () => win.document.body.clientWidth,\r\n    () => win.document.documentElement.clientWidth,\r\n  ];\r\n\r\n  let documentWidthGetter = documentWidthGetters[0];\r\n  let documentWidth = 0;\r\n\r\n  for (const _documentWidthGetter of documentWidthGetters) {\r\n    const _documentWidth = _documentWidthGetter();\r\n\r\n    if (_documentWidth > documentWidth) {\r\n      documentWidthGetter = _documentWidthGetter;\r\n      documentWidth = _documentWidth;\r\n    }\r\n  }\r\n\r\n  return documentWidthGetter;\r\n}\r\n\r\n\r\n/**\r\n * Returns element absolute rect.\r\n *\r\n * @param element Element\r\n * @returns Element absolute rect\r\n */\r\nexport function getElementAbsoluteRect(element: HTMLElement) {\r\n  const rect = {\r\n    height: element.offsetHeight,\r\n    width: element.offsetWidth,\r\n    left: 0,\r\n    top: 0,\r\n  };\r\n\r\n  let currentElement = element;\r\n\r\n  do {\r\n    rect.top += currentElement.offsetTop || 0;\r\n    rect.left += currentElement.offsetLeft || 0;\r\n\r\n    currentElement = currentElement.offsetParent as HTMLElement;\r\n  } while (currentElement);\r\n\r\n  return rect;\r\n}\r\n\r\n\r\n/**\r\n * Returns element relative rect.\r\n *\r\n * @param win Window reference\r\n * @param element Element\r\n * @returns Element relative rect.\r\n */\r\nexport function getElementRelativeRect(win: Window, element: HTMLElement) {\r\n  const rect = {\r\n    height: element.offsetHeight,\r\n    width: element.offsetWidth,\r\n    left: 0,\r\n    top: 0,\r\n  };\r\n\r\n  let currentElement = element;\r\n  let currentElementStyle: CSSStyleDeclaration;\r\n\r\n  do {\r\n    currentElementStyle = currentElement !== element ? win.getComputedStyle(currentElement) : {} as CSSStyleDeclaration;\r\n\r\n    if (currentElementStyle.position === 'relative') {\r\n      break;\r\n    }\r\n\r\n    if (currentElementStyle.position !== 'absolute') {\r\n      rect.top += currentElement.offsetTop || 0;\r\n      rect.left += currentElement.offsetLeft || 0;\r\n    }\r\n\r\n    currentElement = currentElement.offsetParent as HTMLElement;\r\n  } while (currentElement);\r\n\r\n  return rect;\r\n}\r\n\r\n\r\n/**\r\n * Get window viewport height.\r\n *\r\n * @param win Window reference\r\n * @returns Window viewport height\r\n */\r\nexport function getWindowViewportHeight(win: Window): number {\r\n  return win && win.innerHeight || 0;\r\n}\r\n\r\n\r\n/**\r\n * Get window scroll left position.\r\n *\r\n * @param win Window reference\r\n * @returns Window scroll left position\r\n */\r\nexport function getWindowViewportLeft(win: Window): number {\r\n  if (!win) {\r\n    return 0;\r\n  }\r\n\r\n  // The top-left-corner of the viewport is determined by the scroll position of the document\r\n  // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\r\n  // whether `document.body` or `document.documentElement` is the scrolled element, so reading\r\n  // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\r\n  // `document.documentElement` works consistently, where the `top` and `left` values will\r\n  // equal negative the scroll position.\r\n  const documentRect = win.document.documentElement.getBoundingClientRect();\r\n\r\n  return -documentRect.left\r\n    || win.document.body.scrollLeft\r\n    || win.scrollX\r\n    || win.document.documentElement.scrollLeft\r\n    || 0;\r\n}\r\n\r\n\r\n/**\r\n * Get window scroll top position.\r\n *\r\n * @param win Window reference\r\n * @returns Window scroll top position\r\n */\r\nexport function getWindowViewportTop(win: Window): number {\r\n  if (!win) {\r\n    return 0;\r\n  }\r\n\r\n  // The top-left-corner of the viewport is determined by the scroll position of the document\r\n  // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\r\n  // whether `document.body` or `document.documentElement` is the scrolled element, so reading\r\n  // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\r\n  // `document.documentElement` works consistently, where the `top` and `left` values will\r\n  // equal negative the scroll position.\r\n  const documentRect = win.document.documentElement.getBoundingClientRect();\r\n\r\n  return -documentRect.top\r\n    || win.document.body.scrollTop\r\n    || win.scrollY\r\n    || win.document.documentElement.scrollTop\r\n    || 0;\r\n}\r\n\r\n\r\n/**\r\n * Returns `true` when element is scrollable.\r\n *\r\n * @param win Window reference\r\n * @param element Element\r\n * @returns `true` when element is scrollable\r\n */\r\nexport function isElementScrollableY(win: Window, element: HTMLElement): boolean {\r\n  return element.offsetHeight < element.scrollHeight && win.getComputedStyle(element).overflowY === 'auto';\r\n}\r\n\r\n\r\n/**\r\n * Set styles on a given element.\r\n *\r\n * @param renderer Renderer2 instance\r\n * @param element Element\r\n * @param styles Styles\r\n */\r\nexport function setElementStyles(\r\n  renderer: Renderer2,\r\n  element: HTMLElement,\r\n  styles: Partial<Record<keyof CSSStyleDeclaration, string>>,\r\n): void {\r\n  if (!element || !styles) {\r\n    return;\r\n  }\r\n\r\n  const propKeys = Object.keys(styles) as (keyof CSSStyleDeclaration)[];\r\n\r\n  for (const prop of propKeys) {\r\n    const value = styles[prop];\r\n\r\n    if (value) {\r\n      renderer.setStyle(element, prop as string, value);\r\n    } else {\r\n      renderer.removeStyle(element, prop as string);\r\n    }\r\n  }\r\n}\r\n\r\n\r\nexport function isSmoothScrollSupported(win: Window): boolean {\r\n  return win\r\n    && win.document\r\n    && win.document.documentElement\r\n    && win.document.documentElement.style\r\n    && 'scrollBehavior' in win.document.documentElement.style\r\n    ;\r\n}\r\n\r\n\r\nexport function scrollToFactory(win: Window, container: Element | null): Element['scrollTo'];\r\nexport function scrollToFactory(win: Window, container: Element | null): Element['scrollTo'];\r\n/** @internal */\r\nexport function scrollToFactory(win: Window, container: Element | null): Element['scrollTo'] {\r\n  if (!win) {\r\n    return () => {};\r\n  }\r\n  const smoothScrollSupported = isSmoothScrollSupported(win);\r\n  const nativeScrollToFn = container ? container.scrollTo : win.scrollTo;\r\n  const scrollThisArg = container ? container : win;\r\n  const scrollTarget = container ? container : win.document.documentElement;\r\n  const getViewportLeft: () => number = container ? () => container.scrollLeft : () => getWindowViewportLeft(win);\r\n  const getViewportTop: () => number = container ? () => container.scrollTop : () => getWindowViewportTop(win);\r\n  const parseOptions = (\r\n    optionsOrX: ScrollToOptions | number,\r\n    mayY?: number,\r\n  ): ScrollToOptions | null => {\r\n    return optionsOrX != null && typeof optionsOrX !== 'object'\r\n      // scrollTo(x: number, y: number): void\r\n      ? {\r\n          left: !isNaN(+optionsOrX) ? +optionsOrX : getViewportLeft(),\r\n          top: mayY != null && !isNaN(+mayY) ? +mayY : getViewportTop(),\r\n        }\r\n      // scrollTo(options: ScrollToOptions): void\r\n      : optionsOrX != null && typeof optionsOrX === 'object' && ('top' in optionsOrX || 'left' in optionsOrX)\r\n        ? {\r\n            ...optionsOrX as object,\r\n            left: optionsOrX.left != null && !isNaN(+optionsOrX.left) ? +optionsOrX.left : getViewportLeft(),\r\n            top: optionsOrX.top != null && !isNaN(+optionsOrX.top) ? +optionsOrX.top : getViewportTop(),\r\n          }\r\n        \r\n        : null\r\n      ;\r\n  };\r\n  const scrollToFn: (options: ScrollToOptions) => void =\r\n    nativeScrollToFn\r\n      ? smoothScrollSupported\r\n        // function which calls native scrollTo with options as object\r\n        ? options => {\r\n            (nativeScrollToFn as (options: ScrollToOptions) => void).call(scrollThisArg, options);\r\n          }\r\n        // function which calls native scrollTo with flatten options because options as object is not supported\r\n        : options => {\r\n            (nativeScrollToFn as (x: number, y: number) => void).call(scrollThisArg, options.left as number, options.top as number);\r\n          }\r\n      // function which polyfills native scrollTo\r\n      : options => {\r\n          if (options.left !== scrollTarget.scrollLeft) {\r\n            scrollTarget.scrollLeft = options.left as number;\r\n          }\r\n          if (options.top !== scrollTarget.scrollTop) {\r\n            scrollTarget.scrollTop = options.top as number;\r\n          }\r\n        }\r\n      ;\r\n  return ((optionsOrX: ScrollToOptions | number, mayY?: number) => {\r\n    const options: ScrollToOptions | null = parseOptions(optionsOrX, mayY);\r\n    if (options) {\r\n      scrollToFn(options);\r\n    }\r\n  }) as Element['scrollTo'];\r\n}\r\n","import {\r\n  NgxStickyComputation,\r\n  NgxStickyComputed,\r\n  NgxStickyDirection,\r\n  NgxStickyPosition,\r\n} from './sticky.types';\r\n\r\n\r\nexport function coerceStickyPosition(value: any): NgxStickyPosition {\r\n  return isStickyPositionBottom(value) ? 'bottom' : 'top';\r\n}\r\n\r\nexport function coerceStickyDirection(value: any): NgxStickyDirection {\r\n  return isStickyDirectionDown(value) ? 'down' : 'up';\r\n}\r\n\r\n\r\nexport function compareStickiesComputed(a: NgxStickyComputed, b: NgxStickyComputed): number {\r\n  return a.positionBottom === b.positionBottom\r\n    ? a.sortPoint < b.sortPoint && a.boundary.top >= b.boundary.top ? 1 : -1\r\n    : -1;\r\n}\r\n\r\n\r\nexport function getStuckedPositionTop(computation: NgxStickyComputation): number {\r\n  const {\r\n    boundary,\r\n    directionDown,\r\n    height: elementHeight,\r\n    positionBottom,\r\n  } = computation.snap.stickyComputed;\r\n\r\n  let result = directionDown\r\n    ? boundary.top\r\n      + boundary.height\r\n      - elementHeight\r\n      - (positionBottom\r\n          ? computation.offsetStucked\r\n          : boundary.offsetBottom - elementHeight - computation.offsetStucked)\r\n    : positionBottom\r\n      ? boundary.top + boundary.offsetTop - elementHeight - computation.offsetStucked\r\n      : boundary.top + computation.offsetStucked\r\n    ;\r\n\r\n  // adjust position when sticky has spot\r\n  if (computation.snap.sticky.spot) {\r\n    result = directionDown\r\n      ? result\r\n        + computation.offsetSticked + computation.offsetStucked\r\n        + computation.oppositeOffsetSticked + computation.oppositeOffsetStucked\r\n      : result\r\n        - computation.offsetSticked - computation.offsetStucked\r\n        - computation.oppositeOffsetSticked - computation.oppositeOffsetStucked\r\n      ;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n\r\nexport function isStickyPositionBottom(position: NgxStickyPosition): position is 'bottom' {\r\n  return position === 'bottom';\r\n}\r\n\r\nexport function isStickyDirectionDown(direction: NgxStickyDirection): direction is 'down' {\r\n  return direction !== 'up';\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { compareStickiesComputed, isStickyDirectionDown, isStickyPositionBottom } from './sticky.helpers';\r\nimport {\r\n  NgxIntersection,\r\n  NgxIntersectionComputation,\r\n  NgxIntersectionSnap,\r\n  NgxIntersectionState,\r\n  NgxSticky,\r\n  NgxStickyBoundary,\r\n  NgxStickyBoundaryComputed,\r\n  NgxStickyComputation,\r\n  NgxStickyComputed,\r\n  NgxStickyContainer,\r\n  NgxStickyLine,\r\n  NgxStickyPosition,\r\n  NgxStickySnap,\r\n  NgxStickyState,\r\n} from './sticky.types';\r\n\r\n\r\nexport const NGX_STICKY_ENGINE_INTERCEPTION_STATE_MAP = {\r\n  'sticked,normal': 'enter' as const,\r\n  'stucked,normal': 'entered' as const,\r\n  'sticked,sticked': 'entered' as const,\r\n  'stucked,sticked': 'exit' as const,\r\n  'stucked,stucked': 'exited' as const,\r\n};\r\n\r\n\r\n/**\r\n * Defines a sticky engine. Implemented in universal way.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class NgxStickyEngine {\r\n  /**\r\n   * Compute sticky boundary.\r\n   *\r\n   * @param container Container\r\n   * @param boundary Sticky boundary\r\n   * @param sticky Sticky line\r\n   * @param directionDown Direction down\r\n   * @param spot Spot line\r\n   * @param viewportHeight Viewport height\r\n   * @returns Boundary instance\r\n   */\r\n  computeStickyBoundary(\r\n    container: NgxStickyContainer,\r\n    boundary: NgxStickyBoundary | null,\r\n    sticky: NgxStickyLine,\r\n    directionDown: boolean,\r\n    spot: NgxStickyLine | null,\r\n    viewportHeight: number,\r\n  ): NgxStickyBoundaryComputed {\r\n    let {\r\n      height: boundaryHeight,\r\n      top: boundaryTop,\r\n      left: boundaryLeft,\r\n      width: boundaryWidth,\r\n    } = boundary || container;\r\n\r\n    boundaryHeight = boundaryHeight || 0;\r\n    boundaryTop = boundaryTop || 0;\r\n    boundaryWidth = boundaryWidth || 0;\r\n    boundaryLeft = boundaryLeft || 0;\r\n\r\n    if (spot && spot.height) {\r\n      const beforeSpot = sticky.top < spot.top;\r\n\r\n      if (beforeSpot) {\r\n        // when sticky direction is down and is before its spot\r\n        if (directionDown) {\r\n          const spotPoint = spot.top - viewportHeight;\r\n\r\n          // disable sticky when is in same viewport height as its spot\r\n          if (spotPoint < sticky.top) {\r\n            boundaryHeight = 0;\r\n            boundaryTop = 0;\r\n          // adjust sticky boundary height according to its spot when spot point is in base boundary\r\n          } else if (spotPoint < boundaryTop + boundaryHeight) {\r\n            boundaryHeight = spotPoint - boundaryTop;\r\n          }\r\n        }\r\n      } else {\r\n        // when sticky direction is up and is after its spot\r\n        if (!directionDown) {\r\n          const spotPoint = spot.top + spot.height + viewportHeight;\r\n\r\n          // disable sticky when is in same viewport height as its spot\r\n          if (spotPoint > sticky.top) {\r\n            boundaryHeight = 0;\r\n            boundaryTop = 0;\r\n            // adjust sticky boundary top according to its spot when spot point is in base boundary\r\n          } else if (spotPoint > boundaryTop && spotPoint < boundaryTop + boundaryHeight) {\r\n            boundaryHeight -= spotPoint - boundaryTop;\r\n            boundaryTop = spotPoint;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return {\r\n      height: boundaryHeight,\r\n      top: boundaryTop,\r\n      width: boundaryWidth,\r\n      left: boundaryLeft,\r\n      unstacked: boundary && boundary.unstacked || container.unstacked || false,\r\n      offsetBottom: 0,\r\n      offsetTop: 0,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Compute sticky sticked line.\r\n   *\r\n   * @param boundary Sticky boundary line\r\n   * @param sticky Sticky line\r\n   * @param positionBottom Position bottom\r\n   * @param directionDown Direction down\r\n   * @param viewportHeight Viewport height\r\n   * @returns Sticked line\r\n   */\r\n  computeStickyStickedLine(\r\n    boundary: NgxStickyLine,\r\n    sticky: NgxStickyLine,\r\n    positionBottom: boolean,\r\n    directionDown: boolean,\r\n    viewportHeight: number,\r\n  ): NgxStickyLine {\r\n    let stickedTop: number;\r\n    let stickedHeight: number;\r\n\r\n    if (positionBottom) {\r\n      if (directionDown) {\r\n        stickedTop = sticky.top + sticky.height - viewportHeight;\r\n        stickedHeight = boundary.height + boundary.top - stickedTop - viewportHeight;\r\n      } else {\r\n        stickedTop = boundary.top - viewportHeight;\r\n        stickedHeight = sticky.top - stickedTop - viewportHeight;\r\n      }\r\n    } else {\r\n      if (directionDown) {\r\n        stickedTop = sticky.top;\r\n        stickedHeight = boundary.height + boundary.top - stickedTop;\r\n      } else {\r\n        stickedTop = boundary.top;\r\n        stickedHeight = sticky.top - stickedTop;\r\n      }\r\n    }\r\n\r\n    return { top: stickedTop, height: stickedHeight };\r\n  }\r\n\r\n  /**\r\n   * Compute sticky sort point.\r\n   *\r\n   * @param sticky Sticky line\r\n   * @param positionBottom Position bottom\r\n   * @param directionDown Direction down\r\n   * @param viewportHeight Viewport height\r\n   * @returns Sticky sort point\r\n   */\r\n  computeStickySortPoint(\r\n    sticky: NgxStickyLine,\r\n    positionBottom: boolean,\r\n    directionDown: boolean,\r\n    viewportHeight: number,\r\n  ): number {\r\n    let sortPoint: number;\r\n\r\n    if (positionBottom) {\r\n      sortPoint = directionDown\r\n        ? -sticky.top - sticky.height + viewportHeight\r\n        : sticky.top + sticky.height - viewportHeight;\r\n    } else {\r\n      sortPoint = directionDown\r\n        ? -sticky.top\r\n        : sticky.top;\r\n    }\r\n\r\n    return sortPoint;\r\n  }\r\n\r\n  /**\r\n   * Determines intersection state.\r\n   *\r\n   * @param snap Intersection snap\r\n   * @param viewportTop Viewport/scroll top position\r\n   * @returns Intersection computation\r\n   */\r\n  determineIntersectionState(snap: NgxIntersectionSnap, viewportTop: number): NgxIntersectionComputation {\r\n    const enter = this.determineStickyState(snap.enter, viewportTop);\r\n    const exit = this.determineStickyState(snap.exit, viewportTop);\r\n\r\n    // Intersection state can be easily determined from enter sticky and exit sticky states:\r\n    // - enter: when enter sticky (on bottom) is _sticked_ and exit sticky (on top) is _normal_ ;\r\n    // - entered: when enter (on bottom) and exit (on top) stickies are _sticked_ ;\r\n    // - entered: when enter sticky (on bottom) is _stucked_ and exit sticky (on top) is _normal_ ;\r\n    // - exit: when enter sticky (on bottom) is _stucked_ and exit sticky (on top) is _sticked_ ;\r\n    // - exited: when enter (on bottom) and exit (on top) stickies are _stucked_.\r\n    const stateKey = [ enter.state, exit.state ].join(',') as keyof typeof NGX_STICKY_ENGINE_INTERCEPTION_STATE_MAP;\r\n    const state: NgxIntersectionState = NGX_STICKY_ENGINE_INTERCEPTION_STATE_MAP[stateKey] || null;\r\n\r\n    const viewportOffsetless = snap.viewportHeight - enter.offsetSticked - exit.offsetSticked;\r\n    const maxHeightVisible = Math.min(snap.intersection.height, viewportOffsetless);\r\n    let height = 0;\r\n    let intersecting = false;\r\n\r\n    if (state === 'entered') {\r\n      height = maxHeightVisible;\r\n      intersecting = true;\r\n    } else if (state === 'enter') {\r\n      height = viewportTop + snap.viewportHeight - snap.intersection.top - enter.offsetSticked;\r\n      intersecting = true;\r\n    } else if (state === 'exit') {\r\n      height = snap.intersection.top + snap.intersection.height - viewportTop - exit.offsetSticked;\r\n      intersecting = true;\r\n    }\r\n\r\n    const computation: NgxIntersectionComputation = {\r\n      enter,\r\n      exit,\r\n      snap,\r\n      height,\r\n      intersecting,\r\n      ratio: Math.min(1, height / maxHeightVisible),\r\n      state,\r\n      viewportTop,\r\n    };\r\n\r\n    return computation;\r\n  }\r\n\r\n  /**\r\n   * Determines sticky state.\r\n   *\r\n   * @param snap Sticky snap\r\n   * @param viewportTop Viewport/scroll top position\r\n   * @returns Sticky computation\r\n   */\r\n  determineStickyState(snap: NgxStickySnap, viewportTop: number): NgxStickyComputation {\r\n    const computation: NgxStickyComputation = {\r\n      offsetSticked: 0,\r\n      offsetStucked: 0,\r\n      oppositeOffsetSticked: 0,\r\n      oppositeOffsetStucked: 0,\r\n      oppositeState: 'normal',\r\n      state: 'normal',\r\n      snap,\r\n      viewportTop,\r\n    };\r\n\r\n    // cancel computation when stickyComputed is outside its boundary\r\n    if (snap.stickyComputed.disabled) {\r\n      return computation;\r\n    }\r\n\r\n    // last value stored in _stickyComputedState will be related to opposite of stickyComputed\r\n    let _oppositeStickyComputedState: NgxStickyState = 'normal';\r\n    // last value stored in _stickyComputedState will be related to stickyComputed\r\n    let _stickyComputedState: NgxStickyState = 'normal';\r\n\r\n    // compute state for each opposite sibling\r\n    for (const _oppositeStickyComputed of snap.oppositeStickies) {\r\n      const boundaryOffset = _oppositeStickyComputed.directionDown\r\n        ? _oppositeStickyComputed.boundary.offsetBottom\r\n        : _oppositeStickyComputed.boundary.offsetTop;\r\n      let {\r\n        top: _oppositeStickedTop,\r\n        height: _oppositeStickedHeight,\r\n      } = _oppositeStickyComputed.sticked;\r\n\r\n      // adjust _oppositeStickyComputed sticked line with previous sibling\r\n      if (_oppositeStickyComputed.positionBottom) {\r\n        if (_oppositeStickyComputed.directionDown) {\r\n          _oppositeStickedTop += computation.oppositeOffsetSticked + computation.oppositeOffsetStucked;\r\n          _oppositeStickedHeight -= computation.oppositeOffsetStucked;\r\n        } else {\r\n          _oppositeStickedTop += boundaryOffset;\r\n          _oppositeStickedTop += computation.oppositeOffsetSticked;\r\n          _oppositeStickedHeight -= boundaryOffset - computation.oppositeOffsetStucked;\r\n          _oppositeStickedHeight += _oppositeStickyComputed.height;\r\n        }\r\n      } else {\r\n        if (_oppositeStickyComputed.directionDown) {\r\n          _oppositeStickedTop -= computation.oppositeOffsetSticked + computation.oppositeOffsetStucked;\r\n          _oppositeStickedHeight += computation.oppositeOffsetStucked;\r\n          _oppositeStickedHeight -= boundaryOffset;\r\n        } else {\r\n          _oppositeStickedTop -= computation.oppositeOffsetSticked;\r\n          _oppositeStickedHeight -= computation.oppositeOffsetStucked;\r\n        }\r\n      }\r\n\r\n      // set default state to \"normal\"\r\n      _oppositeStickyComputedState = 'normal';\r\n\r\n      // determine _oppositeStickyComputed state with its sticked line adjusted\r\n      // if (viewportTop > _oppositeStickedTop) {\r\n      if (viewportTop >= _oppositeStickedTop) {\r\n        _oppositeStickyComputedState = 'sticked';\r\n\r\n        if (viewportTop > _oppositeStickedTop + _oppositeStickedHeight) {\r\n          _oppositeStickyComputedState = _oppositeStickyComputed.directionDown ? 'stucked' : 'normal';\r\n        }\r\n      } else if (!_oppositeStickyComputed.directionDown) {\r\n        _oppositeStickyComputedState = 'stucked';\r\n      }\r\n\r\n      // cumulate opposite sibling height to the right offset\r\n      if (\r\n        // and state determined is \"sticked\" or \"stucked\"\r\n        _oppositeStickyComputedState !== 'normal'\r\n        // and _oppositeStickyComputed is stacked\r\n        && !_oppositeStickyComputed.boundary.unstacked\r\n      ) {\r\n        if (\r\n          _oppositeStickyComputed.boundary.top === snap.stickyComputed.boundary.top\r\n            && _oppositeStickyComputed.boundary.height === snap.stickyComputed.boundary.height\r\n        ) {\r\n          computation.oppositeOffsetStucked += _oppositeStickyComputed.height;\r\n        } else if (_oppositeStickyComputedState === 'sticked') {\r\n          computation.oppositeOffsetSticked += _oppositeStickyComputed.height;\r\n        }\r\n      }\r\n    }\r\n\r\n    computation.oppositeState = _oppositeStickyComputedState;\r\n\r\n    // compute state for each sibling and stickyComputed in last\r\n    for (const _stickyComputed of snap.stickies) {\r\n      const boundaryOffset = _stickyComputed.directionDown\r\n        ? _stickyComputed.boundary.offsetBottom\r\n        : _stickyComputed.boundary.offsetTop;\r\n      let {\r\n        top: _stickedTop,\r\n        height: _stickedHeight,\r\n      } = _stickyComputed.sticked;\r\n\r\n      // adjust _stickyComputed sticked line with previous sibling\r\n      if (_stickyComputed.positionBottom) {\r\n        if (_stickyComputed.directionDown) {\r\n          _stickedTop += computation.offsetSticked + computation.offsetStucked;\r\n          _stickedHeight -= computation.offsetStucked;\r\n        } else {\r\n          _stickedTop += boundaryOffset;\r\n          _stickedTop += computation.offsetSticked;\r\n          _stickedHeight -= boundaryOffset - computation.offsetStucked;\r\n          _stickedHeight += _stickyComputed.height;\r\n        }\r\n      } else {\r\n        if (_stickyComputed.directionDown) {\r\n          _stickedTop -= computation.offsetSticked + computation.offsetStucked;\r\n          _stickedHeight += computation.offsetStucked;\r\n          _stickedHeight -= boundaryOffset;\r\n        } else {\r\n          _stickedTop -= computation.offsetSticked;\r\n          _stickedHeight -= computation.offsetStucked;\r\n        }\r\n      }\r\n\r\n      // adjust the current _stickyComputed sticked line with previous and opposite siblings when sticky has spot\r\n      if (snap.sticky.spot && _stickyComputed === snap.stickyComputed) {\r\n        const sumOfCurrentAndOppositeOffsets = computation.offsetSticked + computation.offsetStucked\r\n          + computation.oppositeOffsetSticked + computation.oppositeOffsetStucked;\r\n\r\n        // increase sticked line height with sum of sticked and stucked offsets from previous and opposite siblings\r\n        _stickedHeight += sumOfCurrentAndOppositeOffsets;\r\n\r\n        // subtract sum of sticked and stucked offsets from previous and opposite siblings when direction is up\r\n        if (!_stickyComputed.directionDown) {\r\n          _stickedTop -= sumOfCurrentAndOppositeOffsets;\r\n        }\r\n      }\r\n\r\n      // set default state to \"normal\"\r\n      _stickyComputedState = 'normal';\r\n\r\n      // determine _stickyComputed state with its sticked line adjusted\r\n      // if (viewportTop > _stickedTop) {\r\n      if (viewportTop >= _stickedTop) {\r\n        _stickyComputedState = 'sticked';\r\n\r\n        if (viewportTop > _stickedTop + _stickedHeight) {\r\n          _stickyComputedState = _stickyComputed.directionDown ? 'stucked' : 'normal';\r\n        }\r\n      } else if (!_stickyComputed.directionDown) {\r\n        _stickyComputedState = 'stucked';\r\n      }\r\n\r\n      // cumulate sibling height to the right offset\r\n      if (\r\n        // when _stickyComputed isn't stickyComputed\r\n        _stickyComputed !== snap.stickyComputed\r\n        // and state determined is \"sticked\" or \"stucked\"\r\n        && _stickyComputedState !== 'normal'\r\n        // and _stickyComputed is stacked\r\n        && !_stickyComputed.boundary.unstacked\r\n      ) {\r\n        if (\r\n          _stickyComputed.boundary.top === snap.stickyComputed.boundary.top\r\n            && _stickyComputed.boundary.height === snap.stickyComputed.boundary.height\r\n        ) {\r\n          computation.offsetStucked += _stickyComputed.height;\r\n        } else if (_stickyComputedState === 'sticked') {\r\n          computation.offsetSticked += _stickyComputed.height;\r\n        }\r\n      }\r\n    }\r\n\r\n    computation.state = _stickyComputedState;\r\n\r\n    return computation;\r\n  }\r\n\r\n  /**\r\n   * Returns offset height used by sticked stickies for a given side and viewport position.\r\n   *\r\n   * @param container Container\r\n   * @param stickySnaps Array of sticky snaps\r\n   * @param position Position `\"top\"` or `\"bottom\"`\r\n   * @param viewportTop Viewport/scroll top position\r\n   */\r\n  determineStickedOffset(\r\n    container: NgxStickyContainer,\r\n    stickySnaps: NgxStickySnap[],\r\n    position: NgxStickyPosition,\r\n    viewportTop: number,\r\n  ): number {\r\n    const positionBottom = isStickyPositionBottom(position);\r\n    const containerOffset = positionBottom ? container.offsetBottom || 0 : container.offsetTop || 0;\r\n    let stickedOffset = 0;\r\n    let heightOfStickyUnstackedWithMaxHeight = 0;\r\n\r\n    for (const stickySnap of stickySnaps) {\r\n      const { stickyComputed } = stickySnap;\r\n\r\n      if (\r\n        // skip sticky which have different container reference than the given\r\n        stickySnap.container !== container\r\n        // skip sticky which have different position than the given\r\n        || stickyComputed.positionBottom !== positionBottom\r\n        // skip sticky when is disabled\r\n        || stickyComputed.disabled\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      const computation = this.determineStickyState(stickySnap, viewportTop);\r\n\r\n      // add sticky height to sticked offset when state is sticked\r\n      if (computation.state === 'sticked') {\r\n        // add height when sticky is stacked\r\n        if (!stickyComputed.boundary.unstacked) {\r\n          stickedOffset += stickyComputed.height;\r\n        // or update the height of sticky unstacked with max height\r\n        } else if (stickyComputed.height > heightOfStickyUnstackedWithMaxHeight) {\r\n          heightOfStickyUnstackedWithMaxHeight = stickyComputed.height;\r\n        }\r\n      }\r\n    }\r\n\r\n    return containerOffset + stickedOffset + heightOfStickyUnstackedWithMaxHeight;\r\n  }\r\n\r\n  /**\r\n   * Create intersection snap.\r\n   *\r\n   * @param container Container\r\n   * @param stickies Stickies\r\n   * @param intersection Intersection\r\n   * @param viewportHeight Viewport height\r\n   * @returns Intersection snap\r\n   */\r\n  snapIntersection(\r\n    container: NgxStickyContainer,\r\n    stickies: NgxSticky[],\r\n    intersection: NgxIntersection,\r\n    viewportHeight: number,\r\n  ): NgxIntersectionSnap {\r\n    const disabled: boolean = intersection.disabled!;\r\n\r\n    // enter sticky is sticked on bottom\r\n    const enterSticky: NgxSticky = {\r\n      boundary: {\r\n        top: intersection.top - 1,\r\n        height: intersection.height,\r\n        left: container.left,\r\n        width: container.width,\r\n      },\r\n      disabled,\r\n      top: intersection.top - 1,\r\n      height: 1,\r\n      position: 'bottom',\r\n      direction: 'down',\r\n    };\r\n\r\n    // exit sticky is sticked on top\r\n    const exitSticky: NgxSticky = {\r\n      boundary: {\r\n        top: intersection.top,\r\n        height: intersection.height - 1,\r\n        left: container.left,\r\n        width: container.width,\r\n      },\r\n      disabled,\r\n      top: intersection.top,\r\n      height: 1,\r\n      position: 'top',\r\n      direction: 'down',\r\n    };\r\n\r\n    return {\r\n      container,\r\n      enter: this.snapSticky(container, stickies, enterSticky, viewportHeight),\r\n      exit: this.snapSticky(container, stickies, exitSticky, viewportHeight),\r\n      intersection: {\r\n        disabled,\r\n        height: intersection.height,\r\n        thresholds: intersection.thresholds ? [ ...intersection.thresholds ] : [ 0, 1 ],\r\n        top: intersection.top,\r\n      },\r\n      viewportHeight,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Create sticky snap.\r\n   *\r\n   * @param container Container\r\n   * @param stickies Stickies\r\n   * @param sticky Sticky\r\n   * @param viewportHeight Viewport height\r\n   * @returns Sticky snap\r\n   */\r\n  snapSticky(\r\n    container: NgxStickyContainer,\r\n    stickies: NgxSticky[],\r\n    sticky: NgxSticky,\r\n    viewportHeight: number,\r\n  ): NgxStickySnap {\r\n    const boundariesMap: Record<string, NgxStickyBoundaryComputed> = {};\r\n\r\n    const directionDown = isStickyDirectionDown(sticky.direction!);\r\n    const positionBottom = isStickyPositionBottom(sticky.position!);\r\n\r\n    const stickyComputed: NgxStickyComputed = {\r\n      boundary: this.computeStickyBoundary(\r\n        container,\r\n        sticky.boundary!,\r\n        sticky,\r\n        directionDown,\r\n        sticky.spot!,\r\n        viewportHeight,\r\n      ),\r\n      directionDown,\r\n      disabled: false,\r\n      height: sticky.height,\r\n      positionBottom,\r\n      sortPoint: this.computeStickySortPoint(sticky, positionBottom, directionDown, viewportHeight),\r\n      sticked: null!,\r\n      top: sticky.top,\r\n    };\r\n\r\n    if (\r\n      // disable when sticky's container is disabled\r\n      container.disabled\r\n      // disable when sticky is disabled\r\n      || sticky.disabled\r\n      // disable when sticky has zero height\r\n      || !sticky.height\r\n      // disable when sticky has height equal or greater than viewport height\r\n      // || sticky.height >= viewportHeight\r\n      // disable when sticky is outside its boundary\r\n      || sticky.top < stickyComputed.boundary.top\r\n      || sticky.top > stickyComputed.boundary.top + stickyComputed.boundary.height\r\n    ) {\r\n      stickyComputed.disabled = true;\r\n      stickyComputed.sticked = { height: 0, top: 0 };\r\n    } else {\r\n      stickyComputed.sticked = this.computeStickyStickedLine(\r\n        stickyComputed.boundary,\r\n        sticky,\r\n        positionBottom,\r\n        directionDown,\r\n        viewportHeight,\r\n      );\r\n    }\r\n\r\n    const stickiesComputed: NgxStickyComputed[] = [];\r\n    const oppositeStickiesComputed: NgxStickyComputed[] = [];\r\n    let offsetSpacer: NgxSticky;\r\n    let oppositeOffsetSpacer: NgxSticky;\r\n\r\n    if (sticky.disabled) {\r\n      return {\r\n        boundaries: boundariesMap,\r\n        container,\r\n        oppositeStickies: oppositeStickiesComputed,\r\n        stickies: stickiesComputed,\r\n        sticky,\r\n        stickyComputed,\r\n        viewportHeight,\r\n      };\r\n    }\r\n\r\n    // insert fake sticky which represent container offset top\r\n    if (container.offsetTop) {\r\n      if (!stickyComputed.positionBottom) {\r\n        offsetSpacer = {\r\n          boundary: container,\r\n          direction: 'down',\r\n          height: container.offsetTop,\r\n          position: 'top',\r\n          disabled: false,\r\n          top: container.top,\r\n        };\r\n        stickies = [ offsetSpacer, ...stickies ];\r\n      } else {\r\n        oppositeOffsetSpacer = {\r\n          boundary: container,\r\n          direction: 'up',\r\n          height: container.offsetTop,\r\n          position: 'bottom',\r\n          disabled: false,\r\n          top: container.top + container.height - container.offsetTop,\r\n        };\r\n        stickies = [ oppositeOffsetSpacer, ...stickies ];\r\n      }\r\n    }\r\n\r\n    // insert fake sticky which represent container offset bottom\r\n    if (container.offsetBottom) {\r\n      if (stickyComputed.positionBottom) {\r\n        offsetSpacer = {\r\n          boundary: container,\r\n          direction: 'up',\r\n          height: container.offsetBottom,\r\n          position: 'bottom',\r\n          disabled: false,\r\n          top: container.top + container.height - container.offsetBottom,\r\n        };\r\n        stickies = [ offsetSpacer, ...stickies ];\r\n      } else {\r\n        oppositeOffsetSpacer = {\r\n          boundary: container,\r\n          direction: 'down',\r\n          height: container.offsetBottom,\r\n          position: 'top',\r\n          disabled: false,\r\n          top: container.top,\r\n        };\r\n        stickies = [ oppositeOffsetSpacer, ...stickies ];\r\n      }\r\n    }\r\n\r\n    // remove 1px to fix round sizes (offsetLeft and offsetWidth)\r\n    const stickyComputedBoundaryRight = stickyComputed.boundary.left + stickyComputed.boundary.width - 1;\r\n\r\n    for (let _stickyIndex = 0; _stickyIndex < stickies.length; ++_stickyIndex) {\r\n      const _sticky = stickies[_stickyIndex];\r\n      let _directionDown: boolean;\r\n      let _positionBottom: boolean;\r\n      let _stickyComputed: NgxStickyComputed;\r\n      let _stickyComputedBoundaryRight: number;\r\n\r\n      if (_sticky === sticky) {\r\n        _directionDown = stickyComputed.directionDown;\r\n        _positionBottom = stickyComputed.positionBottom;\r\n        _stickyComputed = stickyComputed;\r\n        _stickyComputedBoundaryRight = stickyComputedBoundaryRight;\r\n      } else {\r\n        _directionDown = isStickyDirectionDown(_sticky.direction!);\r\n        _positionBottom = isStickyPositionBottom(_sticky.position!);\r\n\r\n        _stickyComputed = {\r\n          boundary: this.computeStickyBoundary(\r\n            container,\r\n            _sticky.boundary!,\r\n            _sticky,\r\n            _directionDown,\r\n            _sticky.spot!,\r\n            viewportHeight,\r\n          ),\r\n          disabled: false,\r\n          directionDown: _directionDown,\r\n          height: _sticky.height,\r\n          positionBottom: _positionBottom,\r\n          sortPoint: this.computeStickySortPoint(_sticky, _positionBottom, _directionDown, viewportHeight),\r\n          sticked: null!,\r\n          top: _sticky.top,\r\n        };\r\n\r\n        // remove 1px to fix round sizes (offsetLeft and offsetWidth)\r\n        _stickyComputedBoundaryRight = _stickyComputed.boundary.left + _stickyComputed.boundary.width - 1;\r\n\r\n        if (\r\n          // skip sticky which is disabled\r\n          _sticky.disabled\r\n          // skip sticky which has zero height\r\n          || !_sticky.height\r\n          // skip sticky which has height equal or greater than viewport height\r\n          // || _sticky.height >= viewportHeight\r\n          // skip sticky which isn't in its boundary\r\n          || _sticky.top < _stickyComputed.boundary.top\r\n          || _sticky.top > _stickyComputed.boundary.top + _stickyComputed.boundary.height\r\n          // skip sticky sibling when its boundary isn't align horizontaly\r\n          || stickyComputedBoundaryRight <= _stickyComputed.boundary.left\r\n          || stickyComputed.boundary.left >= _stickyComputedBoundaryRight\r\n        ) {\r\n          _stickyComputed.disabled = true;\r\n          _stickyComputed.sticked = { height: 0, top: 0 };\r\n        } else {\r\n          _stickyComputed.sticked = this.computeStickyStickedLine(\r\n            _stickyComputed.boundary,\r\n            _sticky,\r\n            _positionBottom,\r\n            _directionDown,\r\n            viewportHeight,\r\n          );\r\n        }\r\n      }\r\n\r\n      // compute boundary unique key\r\n      const boundaryKey = [ _stickyComputed.boundary.top, _stickyComputed.boundary.height ].join(',');\r\n\r\n      // ensure stickies computed to use same boundary instance\r\n      if (boundariesMap[boundaryKey]) {\r\n        _stickyComputed.boundary = boundariesMap[boundaryKey];\r\n      } else {\r\n        boundariesMap[boundaryKey] = _stickyComputed.boundary;\r\n      }\r\n\r\n      // skip sticky sibling when is disabled\r\n      if (_stickyComputed.disabled) {\r\n        continue;\r\n      }\r\n\r\n      // set sticky sibling height as max boundary offset when it unstacked\r\n      if (_stickyComputed.boundary.unstacked) {\r\n        if (_directionDown) {\r\n          if (_sticky.height > _stickyComputed.boundary.offsetBottom) {\r\n            _stickyComputed.boundary.offsetBottom = _sticky.height;\r\n          }\r\n        } else {\r\n          if (_sticky.height > _stickyComputed.boundary.offsetTop) {\r\n            _stickyComputed.boundary.offsetTop = _sticky.height;\r\n          }\r\n        }\r\n      // add sticky sibling height to right boundary offset when it stacked\r\n      } else {\r\n        if (_directionDown) {\r\n          _stickyComputed.boundary.offsetBottom += _sticky.height;\r\n        } else {\r\n          _stickyComputed.boundary.offsetTop += _sticky.height;\r\n        }\r\n      }\r\n\r\n      // pushforce offset spacer as sticky siblings\r\n      if (_sticky === offsetSpacer!) {\r\n        stickiesComputed.push(_stickyComputed);\r\n        continue;\r\n      }\r\n\r\n      // pushforce opposite offset spacer as opposite sticky siblings\r\n      if (_sticky === oppositeOffsetSpacer!) {\r\n        oppositeStickiesComputed.push(_stickyComputed);\r\n        continue;\r\n      }\r\n\r\n      // collect stickyComputed siblings\r\n      if (\r\n        // when _stickyComputed isn't stickyComputed\r\n        _stickyComputed !== stickyComputed\r\n        // and its sticked line intersects top of stickyComputed sticked line\r\n        && stickyComputed.sticked.top >= _stickyComputed.sticked.top\r\n        && stickyComputed.sticked.top <= _stickyComputed.sticked.top + _stickyComputed.sticked.height\r\n        // and its top is before stickyComputed top according to its own position\r\n        && (\r\n          _stickyComputed.directionDown\r\n            ? _stickyComputed.top < stickyComputed.top\r\n            : _stickyComputed.top > stickyComputed.top\r\n        )\r\n      ) {\r\n        // and its position equals to stickyComputed position\r\n        if (_stickyComputed.positionBottom === stickyComputed.positionBottom) {\r\n          stickiesComputed.push(_stickyComputed);\r\n        // else _stickyComputed is an opposite sibling\r\n        } else {\r\n          oppositeStickiesComputed.push(_stickyComputed);\r\n        }\r\n      }\r\n    }\r\n\r\n    // sort opposite siblings according to their respective sortPoint and boundary top\r\n    oppositeStickiesComputed.sort(compareStickiesComputed);\r\n\r\n    // sort siblings according to their respective sortPoint and boundary top\r\n    stickiesComputed.sort(compareStickiesComputed);\r\n\r\n    // add stickyComputed in last position\r\n    stickiesComputed.push(stickyComputed);\r\n\r\n    return {\r\n      container,\r\n      boundaries: boundariesMap,\r\n      oppositeStickies: oppositeStickiesComputed,\r\n      stickies: stickiesComputed,\r\n      sticky,\r\n      stickyComputed,\r\n      viewportHeight,\r\n    };\r\n  }\r\n\r\n  _collectStickySnaps(\r\n    container: NgxStickyContainer,\r\n    stickies: NgxSticky[],\r\n    position: 'both' | NgxStickyPosition,\r\n    viewportHeight: number,\r\n  ): NgxStickySnap[] {\r\n    const stickySnaps: NgxStickySnap[] = [];\r\n\r\n    if (position !== 'both') {\r\n      const positionBottom = isStickyPositionBottom(position);\r\n      stickies = stickies.filter(sticky => isStickyPositionBottom(sticky.position!) === positionBottom);\r\n    }\r\n\r\n    for (const sticky of stickies) {\r\n      const stickySnap = this.snapSticky(container, stickies, sticky, viewportHeight);\r\n      if (!stickySnap.stickyComputed.disabled) {\r\n        stickySnaps.push(stickySnap);\r\n      }\r\n    }\r\n    \r\n    return stickySnaps;\r\n  }\r\n}\r\n","import { Directive, Input, NgZone, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\r\nimport { Observable, Subject, Subscription, animationFrameScheduler, fromEvent, merge, of } from 'rxjs';\r\nimport { debounceTime, filter, map, startWith, switchMap, takeUntil, throttleTime } from 'rxjs/operators';\r\n\r\nimport { NgxStickyBaseContainerController } from './sticky-base-container.controller';\r\nimport { NgxStickyEngine } from './sticky-engine';\r\nimport { NgxScrollPlan, NgxScrollPlanStep, NgxStickyContainer, NgxStickyContainerController, NgxStickyController } from './sticky.types';\r\nimport { coerceBooleanProperty, coerceNumberProperty } from './utils/coercion';\r\nimport { ConfigSubject, ConfigSubjectSchema } from './utils/config-subject';\r\nimport {\r\n  getDocumentHeightFactory,\r\n  getDocumentWidthFactory,\r\n  getElementAbsoluteRect,\r\n  getWindowViewportHeight,\r\n  getWindowViewportLeft,\r\n  getWindowViewportTop,\r\n  isElementScrollableY,\r\n  scrollToFactory,\r\n} from './utils/dom';\r\n\r\n\r\nexport interface NgxStickyContainerConfig {\r\n  disabled: boolean;\r\n  offsetTop: number;\r\n  offsetBottom: number;\r\n  unstacked: boolean;\r\n}\r\n\r\n\r\nexport const NGX_STICKY_BASE_CONTAINER_CONFIG_SCHEMA: ConfigSubjectSchema<NgxStickyContainerConfig> = {\r\n  disabled: {\r\n    aliasKey: 'stickyDisabled',\r\n    defaultValue: false,\r\n    coercion: coerceBooleanProperty,\r\n  },\r\n  offsetTop: {\r\n    aliasKey: 'stickyOffsetTop',\r\n    defaultValue: 0,\r\n    coercion: coerceNumberProperty,\r\n  },\r\n  offsetBottom: {\r\n    aliasKey: 'stickyOffsetBottom',\r\n    defaultValue: 0,\r\n    coercion: coerceNumberProperty,\r\n  },\r\n  unstacked: {\r\n    aliasKey: 'stickyUnstacked',\r\n    defaultValue: false,\r\n    coercion: coerceBooleanProperty,\r\n  },\r\n};\r\n\r\n\r\n/**\r\n * Abstract sticky container directive.\r\n */\r\n@Directive()\r\nexport abstract class NgxStickyBaseContainerDirective extends NgxStickyBaseContainerController implements OnChanges, OnDestroy {\r\n  static ngAcceptInputType_stickyDisabled: boolean | string | null | undefined;\r\n  static ngAcceptInputType_stickyOffsetBottom: number | string | null | undefined;\r\n  static ngAcceptInputType_stickyOffsetTop: number | string | null | undefined;\r\n  static ngAcceptInputType_stickyUnstacked: boolean | string | null | undefined;\r\n\r\n  /**\r\n   * Returns HTMLElement of the container or `null` in case of root container.\r\n   */\r\n  abstract readonly element: HTMLElement;\r\n\r\n  /**\r\n   * Disable sticky. container.\r\n   *\r\n   * Defaults to `false`.\r\n   */\r\n  @Input()\r\n  stickyDisabled!: boolean;\r\n\r\n  /**\r\n   * Defines offset bottom inside the sticky container.\r\n   */\r\n  @Input()\r\n  stickyOffsetBottom!: number;\r\n\r\n  /**\r\n   * Defines offset top inside the sticky container.\r\n   */\r\n  @Input()\r\n  stickyOffsetTop!: number;\r\n\r\n  /**\r\n   * Enable/disable sticky stack inside container.\r\n   *\r\n   * Defaults to `false`.\r\n   */\r\n  @Input()\r\n  stickyUnstacked!: boolean;\r\n\r\n  get config(): NgxStickyContainerConfig {\r\n    return this.config$.getValue();\r\n  }\r\n\r\n  get disabled(): boolean {\r\n    return this.config.disabled;\r\n  }\r\n\r\n  /** Inputs config */\r\n  readonly config$ = new ConfigSubject(NGX_STICKY_BASE_CONTAINER_CONFIG_SCHEMA);\r\n\r\n  /** Container which reflect last call of _computeContainer() */\r\n  _container!: NgxStickyContainer;\r\n\r\n  /** Emits when the service is destroyed. */\r\n  readonly destroyed$ = new Subject<void>();\r\n\r\n  /** Monitoring subscription which trigger update stickies */\r\n  _monitoring!: Subscription;\r\n\r\n  /** Emits when updateStickies() is called */\r\n  _updateStickies$ = new Subject<boolean>();\r\n\r\n  /** Getter for document height */\r\n  readonly _getDocumentHeight: () => number;\r\n  /** Getter for document width */\r\n  readonly _getDocumentWidth: () => number;\r\n\r\n  /** Scrolling function lazily created */\r\n  _scrollToFn?: NgxScrollPlanStep['scrollToFn'];\r\n\r\n  constructor(\r\n    readonly containerParent: NgxStickyContainerController,\r\n    readonly stickyEngine: NgxStickyEngine,\r\n    readonly ngZone: NgZone,\r\n    readonly _win: Window,\r\n  ) {\r\n    super();\r\n\r\n    if (this.containerParent) {\r\n      this.containerParent.registerContainer(this);\r\n    }\r\n\r\n    this._getDocumentHeight = getDocumentHeightFactory(this._win);\r\n    this._getDocumentWidth = getDocumentWidthFactory(this._win);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.config$.nextChanges(changes);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.containerParent) {\r\n      this.containerParent.unregisterContainer(this);\r\n    }\r\n\r\n    if (!this.destroyed$.isStopped) {\r\n      this.destroyed$.next();\r\n      this.destroyed$.complete();\r\n    }\r\n\r\n    this._destroyMonitoring();\r\n  }\r\n\r\n  beforeRefresh(fastUpdate?: boolean): void {\r\n    if (!fastUpdate) {\r\n      this._container = null!;\r\n    }\r\n  }\r\n\r\n  createScrollPlan(\r\n    target: number | string | HTMLElement,\r\n    optionsOrExtraOffsetTop?: { excludeStickies?: boolean; extraOffsetTop?: number; } | number,\r\n  ): NgxScrollPlan {\r\n    // const options = typeof optionsOrExtraOffsetTop === 'number' ? { extraOffsetTop: optionsOrExtraOffsetTop } : optionsOrExtraOffsetTop;\r\n    const options = optionsOrExtraOffsetTop;\r\n    const scrollPlan: NgxScrollPlan = [];\r\n\r\n    if (!this._win) {\r\n      return scrollPlan;\r\n    }\r\n\r\n    if (!this._scrollToFn) {\r\n      this._scrollToFn = scrollToFactory(this._win, this.element) as NgxScrollPlanStep['scrollToFn'];\r\n    }\r\n\r\n    const scrollToFn = this._scrollToFn;\r\n    let containsElement = false;\r\n\r\n    if (typeof target === 'string') {\r\n      const elementAsNumber = parseFloat(target as string);\r\n\r\n      if (!isNaN(elementAsNumber)) {\r\n        target = elementAsNumber;\r\n      } else {\r\n        if (this.element) {\r\n          target = this.element.querySelector<HTMLElement>(target)!;\r\n        } else {\r\n          target = this._win.document.querySelector<HTMLElement>(target)!;\r\n        }\r\n\r\n        if (target) {\r\n          containsElement = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (typeof target === 'number' && !isNaN(target)) {\r\n      const elementTop = this.fixViewportTop(target, options);\r\n\r\n      scrollPlan.push({\r\n        scrollToOptions: { left: this.getViewportLeft(), top: elementTop },\r\n        scrollToFn,\r\n      });\r\n\r\n      return scrollPlan;\r\n    }\r\n\r\n    // if (!target || !(target instanceof HTMLElement)) {\r\n    if (!target || !((target as HTMLElement).tagName)) {\r\n      return scrollPlan;\r\n    }\r\n\r\n    containsElement = containsElement || !this.element || this.element.contains(target as HTMLElement);\r\n\r\n    if (!containsElement) {\r\n      return scrollPlan;\r\n    }\r\n\r\n    let targetContainer!: NgxStickyBaseContainerDirective;\r\n    let targetContainerScrollPlan!: NgxScrollPlan;\r\n\r\n    for (const containerController of (this.containers as NgxStickyBaseContainerDirective[])) {\r\n      const containerScrollPlan = containerController.createScrollPlan(target, options);\r\n\r\n      if (containerScrollPlan.length) {\r\n        targetContainerScrollPlan = containerScrollPlan;\r\n        targetContainer = containerController as NgxStickyBaseContainerDirective;\r\n\r\n        break;\r\n      }\r\n    }\r\n\r\n    const containerScrollable = !this.element || isElementScrollableY(this._win, this.element);\r\n\r\n    if (containerScrollable) {\r\n      const targetLine = targetContainer\r\n        ? targetContainer.getContainer()\r\n        : getElementAbsoluteRect(target as HTMLElement);\r\n      const targetTopFixed = this.fixViewportTop(targetLine.top, options);\r\n\r\n      scrollPlan.push({\r\n        scrollToFn,\r\n        scrollToOptions: { left: this.getViewportLeft(), top: targetTopFixed },\r\n      });\r\n    }\r\n\r\n    if (targetContainerScrollPlan) {\r\n      scrollPlan.push(...targetContainerScrollPlan);\r\n    }\r\n\r\n    return scrollPlan;\r\n  }\r\n\r\n  disableStickies(): void {\r\n    this.config$.nextKeyValue('disabled', true, { skipCoercion: true });\r\n  }\r\n\r\n  enableStickies(): void {\r\n    this.config$.nextKeyValue('disabled', false, { skipCoercion: true });\r\n  }\r\n\r\n  getContainer(): NgxStickyContainer {\r\n    if (!this._container) {\r\n      this._container = this._computeContainer();\r\n    }\r\n\r\n    return this._container;\r\n  }\r\n\r\n  getViewportHeight(): number {\r\n    return getWindowViewportHeight(this._win);\r\n  }\r\n\r\n  getViewportLeft(): number {\r\n    return getWindowViewportLeft(this._win);\r\n  }\r\n\r\n  getViewportTop(): number {\r\n    return getWindowViewportTop(this._win);\r\n  }\r\n\r\n  override registerSticky(sticky: NgxStickyController): void {\r\n    super.registerSticky(sticky);\r\n\r\n    if (this.stickies.length) {\r\n      this._initMonitoring();\r\n    }\r\n  }\r\n\r\n  override unregisterSticky(sticky: NgxStickyController): void {\r\n    super.unregisterSticky(sticky);\r\n\r\n    if (!this.stickies.length) {\r\n      this._destroyMonitoring();\r\n    }\r\n  }\r\n\r\n  scrollToTop(\r\n    target: number | string | HTMLElement,\r\n    optionsOrExtraOffsetTop?: { excludeStickies?: boolean; extraOffsetTop?: number; } | number,\r\n  ): void {\r\n    // const options = typeof optionsOrExtraOffsetTop === 'number' ? { extraOffsetTop: optionsOrExtraOffsetTop } : optionsOrExtraOffsetTop;\r\n    const options = optionsOrExtraOffsetTop;\r\n    const scrollPlan = this.createScrollPlan(target, options);\r\n\r\n    for (const scrollStep of scrollPlan) {\r\n      scrollStep.scrollToFn(scrollStep.scrollToOptions);\r\n    }\r\n  }\r\n\r\n  override updateStickies(fastUpdate?: boolean): void {\r\n    // intercept update stickies to throttle calls\r\n    this._updateStickies$.next(!!fastUpdate);\r\n  }\r\n\r\n  _computeContainer(): NgxStickyContainer {\r\n    const config = this.config$.getValue();\r\n\r\n    const containerRect = this.element ? getElementAbsoluteRect(this.element) : null;\r\n\r\n    return {\r\n      disabled: this.disabled,\r\n      height: containerRect ? this.element.scrollHeight : this._getDocumentHeight(),\r\n      left: containerRect ? containerRect.left : 0,\r\n      offsetBottom: config.offsetBottom,\r\n      offsetTop: config.offsetTop,\r\n      top: containerRect ? containerRect.top : 0,\r\n      unstacked: config.unstacked,\r\n      width: containerRect ? this.element.scrollWidth : this._getDocumentWidth(),\r\n    };\r\n  }\r\n\r\n  _createMonitoringObservable(): Observable<boolean> {\r\n    if (!this._win) {\r\n      return of();\r\n    }\r\n\r\n    const updateStickiesFast$ = merge(\r\n      this._updateStickies$.pipe(filter(fastUpdate => fastUpdate)),\r\n      fromEvent(this.element || this._win, 'scroll', { passive: true }),\r\n    ).pipe(\r\n      throttleTime(0, animationFrameScheduler, { leading: true, trailing: true }),\r\n    );\r\n\r\n    const updateStickiesFull$ = merge(\r\n      this.config$,\r\n      this._updateStickies$.pipe(filter(fastUpdate => !fastUpdate)),\r\n      fromEvent(this._win.document, 'DOMContentLoaded', { passive: true }),\r\n      fromEvent(this._win, 'load', { passive: true }),\r\n      fromEvent(this._win, 'pageshow', { passive: true }),\r\n      // fromEvent(this._win, 'visibilitychange', { passive: true }),\r\n      fromEvent(this._win, 'orientationchange', { passive: true }),\r\n      fromEvent(this._win, 'resize', { capture: true, passive: true }),\r\n    ).pipe(\r\n      debounceTime(0, animationFrameScheduler),\r\n    );\r\n\r\n    return updateStickiesFull$.pipe(\r\n      takeUntil(this.destroyed$),\r\n      switchMap(() => {\r\n        return updateStickiesFast$.pipe(\r\n          map(() => true),\r\n          startWith(false),\r\n          takeUntil(this.destroyed$),\r\n        );\r\n      }),\r\n    );\r\n  }\r\n\r\n  _destroyMonitoring(): void {\r\n    if (this._monitoring) {\r\n      this._monitoring.unsubscribe();\r\n      this._monitoring = null!;\r\n    }\r\n  }\r\n\r\n  _initMonitoring(): void {\r\n    if (!this._win || this._monitoring) {\r\n      return;\r\n    }\r\n\r\n    this.ngZone.runOutsideAngular(() => {\r\n      this._monitoring = this._createMonitoringObservable().pipe(\r\n        takeUntil(this.destroyed$),\r\n      ).subscribe(fastUpdate => {\r\n        this._updateStickies(fastUpdate);\r\n      });\r\n\r\n      // fromMediaQuery(this._win, 'print').pipe(\r\n      //   takeUntil(this.destroyed$),\r\n      // ).subscribe(mqlEvent => {\r\n      //   if (mqlEvent.matches) {\r\n      //     this.disableStickies();\r\n      //   } else {\r\n      //     this.enableStickies();\r\n      //   }\r\n      // });\r\n    });\r\n  }\r\n\r\n  _updateStickies(fastUpdate?: boolean): void {\r\n    super.updateStickies(fastUpdate);\r\n  }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n\r\nexport const NGX_STICKY_WINDOW = new InjectionToken<Window>('NGX_STICKY_WINDOW', {\r\n  providedIn: 'root',\r\n  factory: () => typeof window !== 'undefined' ? window : null!,\r\n});\r\n","import { Inject, Injectable, NgZone } from '@angular/core';\r\n\r\nimport { NgxStickyBaseContainerDirective, NgxStickyContainerConfig } from './sticky-base-container.directive';\r\nimport { NgxStickyEngine } from './sticky-engine';\r\nimport { NGX_STICKY_WINDOW } from './sticky.tokens';\r\nimport { NgxStickyContainerController } from './sticky.types';\r\n\r\n\r\n/**\r\n * Defines the sticky root container which is used to manage sticky without container.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class NgxStickyRootContainerController extends NgxStickyBaseContainerDirective {\r\n  // root container never has parent container\r\n  override readonly containerParent: NgxStickyContainerController = null!;\r\n  // root container never has element\r\n  readonly element: HTMLElement = null!;\r\n\r\n  constructor(\r\n    stickyEngine: NgxStickyEngine,\r\n    ngZone: NgZone,\r\n    @Inject(NGX_STICKY_WINDOW)\r\n    _win: Window,\r\n  ) {\r\n    super(null!, stickyEngine, ngZone, _win);\r\n\r\n    // define aliases to input handly because the root container isn't an angular directive\r\n    Object.keys(this.config$._aliases).forEach(<K extends keyof NgxStickyContainerConfig>(alias: string) => {\r\n      const configKey = this.config$._aliases[alias] as K;\r\n      Object.defineProperty(this, alias, {\r\n        get: (): NgxStickyContainerConfig[K] => this.config$.getKeyValue(configKey),\r\n        set: (value: NgxStickyContainerConfig[K]) => this.config$.nextKeyValue(configKey, value),\r\n      });\r\n    });\r\n  }\r\n}\r\n","import { Directive, ElementRef, Inject, NgZone, Optional, SkipSelf, forwardRef } from '@angular/core';\r\n\r\nimport { NgxStickyBaseContainerDirective } from './sticky-base-container.directive';\r\nimport { NgxStickyEngine } from './sticky-engine';\r\nimport { NgxStickyRootContainerController } from './sticky-root-container.controller';\r\nimport { NGX_STICKY_WINDOW } from './sticky.tokens';\r\nimport { NgxStickyContainerController } from './sticky.types';\r\n\r\n\r\n/**\r\n * Defines a sticky container.\r\n */\r\n@Directive({\r\n  selector: '[ngxStickyContainer], [ngx-sticky-container], ngx-sticky-container',\r\n  exportAs: 'ngxStickyContainer',\r\n})\r\nexport class NgxStickyContainerDirective extends NgxStickyBaseContainerDirective {\r\n  /**\r\n   * Returns HTMLElement of the container.\r\n   */\r\n  get element(): HTMLElement {\r\n    return this.elementRef.nativeElement;\r\n  }\r\n\r\n  constructor(\r\n    readonly rootContainer: NgxStickyRootContainerController,\r\n    @SkipSelf() @Optional() @Inject(forwardRef(() => NgxStickyContainerDirective))\r\n    readonly stickyContainerParent: NgxStickyContainerController,\r\n    stickyEngine: NgxStickyEngine,\r\n    ngZone: NgZone,\r\n    readonly elementRef: ElementRef<HTMLElement>,\r\n    @Inject(NGX_STICKY_WINDOW)\r\n    _win: Window,\r\n  ) {\r\n    // use root container when boundary isn't in container\r\n    super(stickyContainerParent || rootContainer, stickyEngine, ngZone, _win);\r\n  }\r\n\r\n  override getViewportHeight(): number {\r\n    return this.element.offsetHeight;\r\n  }\r\n\r\n  override getViewportLeft(): number {\r\n    return this.element.scrollLeft;\r\n  }\r\n\r\n  override getViewportTop(): number {\r\n    return this.element.scrollTop;\r\n  }\r\n}\r\n","\r\n\r\n/** Coerces a data-bound value (typically a string) to intersection thresholds. */\r\nexport function coerceIntersectionThresholds(thresholds: any) {\r\n  if (typeof thresholds === 'number') {\r\n    return [ thresholds ];\r\n  }\r\n\r\n  if (typeof thresholds === 'string') {\r\n    return (thresholds as string)\r\n      .split(',')\r\n      .map(x => (parseFloat(x) || 0))\r\n      .sort();\r\n  }\r\n\r\n  if (!thresholds) {\r\n    return [ 0, 1 ];\r\n  }\r\n\r\n  if (!Array.isArray(thresholds)) {\r\n    thresholds = [ thresholds ];\r\n  }\r\n\r\n  return [ ...thresholds ].sort();\r\n}\r\n\r\n\r\n/**\r\n * Returns threshold crossed for a given ratio change.\r\n *\r\n * @param thresholds Thresholds\r\n * @param oldRatio Old ratio\r\n * @param newRatio New ratio\r\n * @returns Threshold crossed or `undefined`\r\n */\r\nexport function getCrossedThreshold(thresholds: number[], oldRatio: number, newRatio: number): number {\r\n  let crossedThreshold!: number;\r\n\r\n  for (const threshold of thresholds) {\r\n    if (\r\n      // threshold is perfect-crossed by old ratio\r\n      threshold === oldRatio\r\n      // or threshold is perfect-crossed by new ratio\r\n      || threshold === newRatio\r\n      // or threshold is crossed by new ratio and old ratio (there are on the opposite sides)\r\n      || threshold < oldRatio !== threshold < newRatio\r\n    ) {\r\n      crossedThreshold = threshold;\r\n      break;\r\n    }\r\n  }\r\n\r\n  return crossedThreshold;\r\n}\r\n","import {\r\n  AfterViewInit,\r\n  Directive,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Inject,\r\n  Input,\r\n  NgZone,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Optional,\r\n  Output,\r\n  SimpleChanges,\r\n  forwardRef,\r\n} from '@angular/core';\r\nimport { Observable, Subject, Subscription, animationFrameScheduler } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map, takeUntil } from 'rxjs/operators';\r\n\r\nimport { NgxStickyBaseContainerDirective } from './sticky-base-container.directive';\r\nimport { NgxStickyContainerDirective } from './sticky-container.directive';\r\nimport { NgxStickyRootContainerController } from './sticky-root-container.controller';\r\nimport { NGX_STICKY_WINDOW } from './sticky.tokens';\r\nimport {\r\n  NgxIntersection,\r\n  NgxIntersectionComputation,\r\n  NgxIntersectionController,\r\n  NgxIntersectionState,\r\n  NgxStickyContainerController,\r\n} from './sticky.types';\r\nimport { coerceBooleanProperty } from './utils/coercion';\r\nimport { ConfigSubject, ConfigSubjectSchema } from './utils/config-subject';\r\nimport { getElementAbsoluteRect } from './utils/dom';\r\nimport { coerceIntersectionThresholds, getCrossedThreshold } from './utils/intersection';\r\n\r\n\r\nexport interface NgxIntersectionConfig {\r\n  disabled: boolean;\r\n  thresholds: number[];\r\n}\r\n\r\n\r\nexport const NGX_BASE_INTERSECTION_CONFIG_SCHEMA: ConfigSubjectSchema<NgxIntersectionConfig> = {\r\n  disabled: {\r\n    aliasKey: 'intersectionDisabled',\r\n    defaultValue: false,\r\n    coercion: coerceBooleanProperty,\r\n  },\r\n  thresholds: {\r\n    aliasKey: 'intersectionThresholds',\r\n    defaultValue: [ 0, 1 ],\r\n    coercion: coerceIntersectionThresholds,\r\n  },\r\n};\r\n\r\n\r\n@Directive({\r\n  selector: '[ngxInViewport], [ngx-in-viewport], ngx-in-viewport',\r\n  exportAs: 'ngxInViewport',\r\n})\r\nexport class NgxInViewportDirective implements NgxIntersectionController, AfterViewInit, OnChanges, OnDestroy {\r\n  static ngAcceptInputType_intersectionDisabled: boolean | string | null | undefined;\r\n  static ngAcceptInputType_intersectionThresholds: number[] | string | null | undefined;\r\n\r\n  /**\r\n   * Disable intersection.\r\n   *\r\n   * Defaults to `false`.\r\n   */\r\n  @Input()\r\n  intersectionDisabled!: boolean;\r\n\r\n  /**\r\n   * Intersection thresholds.\r\n   *\r\n   * Defaults to `[ 0, 1 ]`.\r\n   */\r\n  @Input()\r\n  intersectionThresholds!: number[];\r\n\r\n  /**\r\n   * Emit intersection.\r\n   */\r\n  @Output()\r\n  readonly intersection = new EventEmitter<NgxIntersectionComputation>();\r\n\r\n  /**\r\n   * Emit intersection computation.\r\n   */\r\n  @Output()\r\n  readonly intersectionComputation = new EventEmitter<NgxIntersectionComputation>();\r\n\r\n  /**\r\n   * Emit intersection state.\r\n   */\r\n  @Output()\r\n  readonly intersectionState = new EventEmitter<NgxIntersectionState>();\r\n\r\n  /**\r\n   * Emit intersection threshold.\r\n   */\r\n  @Output()\r\n  readonly intersectionThreshold = new EventEmitter<number>();\r\n\r\n  get container(): NgxStickyContainerController {\r\n    return this._container;\r\n  }\r\n\r\n  get config(): NgxIntersectionConfig {\r\n    return this.config$.getValue();\r\n  }\r\n\r\n  get disabled(): boolean {\r\n    return this.config.disabled;\r\n  }\r\n\r\n  /**\r\n   * State of the intersection.\r\n   */\r\n  get state(): NgxIntersectionState {\r\n    return this._intersectionState;\r\n  }\r\n\r\n  /** Inputs config */\r\n  readonly config$ = new ConfigSubject<NgxIntersectionConfig>(NGX_BASE_INTERSECTION_CONFIG_SCHEMA);\r\n\r\n  /** Intersection container controller */\r\n  readonly _container: NgxStickyBaseContainerDirective;\r\n\r\n  /** Emits when the component is destroyed. */\r\n  readonly _destroyed$ = new Subject<void>();\r\n\r\n  /** Intersection which reflect last call of _computeIntersection() */\r\n  _intersection!: NgxIntersection;\r\n\r\n  /** Intersection computation which reflect last call of _refreshIntersection()  */\r\n  _intersectionComputation!: NgxIntersectionComputation;\r\n\r\n  /** Intersection computation with last threshold crossed */\r\n  _intersectionCrossed!: NgxIntersectionComputation;\r\n\r\n  /** Last inetersection state crossed */\r\n  _intersectionState!: NgxIntersectionState;\r\n\r\n  /** Last inetersection threshold crossed */\r\n  _intersectionThreshold!: number;\r\n\r\n  /** Monitoring subscription which trigger update stickies and handle refresh */\r\n  _monitoring!: Subscription;\r\n\r\n  /** Emits when refresh() is called */\r\n  readonly _refresh$ = new Subject<NgxIntersectionComputation>();\r\n\r\n  constructor(\r\n    readonly rootContainer: NgxStickyRootContainerController,\r\n    @Optional() @Inject(forwardRef(() => NgxStickyContainerDirective))\r\n    readonly stickyContainer: NgxStickyContainerDirective,\r\n    readonly elementRef: ElementRef<HTMLElement>,\r\n    readonly ngZone: NgZone,\r\n    @Inject(NGX_STICKY_WINDOW)\r\n    readonly _win: Window,\r\n  ) {\r\n    // use root container when sticky isn't in container\r\n    this._container = stickyContainer || rootContainer;\r\n\r\n    // register in parent container for first update calls\r\n    this.container.registerIntersection(this);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.config$.nextChanges(changes);\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this._initMonitoring();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.container.unregisterIntersection(this);\r\n\r\n    if (!this._destroyed$.isStopped) {\r\n      this._destroyed$.next();\r\n      this._destroyed$.complete();\r\n    }\r\n\r\n    this._destroyMonitoring();\r\n  }\r\n\r\n  beforeRefresh(fastUpdate?: boolean): void {\r\n    if (!fastUpdate) {\r\n      this._intersection = null!;\r\n    }\r\n  }\r\n\r\n  disableIntersection(): void {\r\n    this.config$.nextKeyValue('disabled', true, { skipCoercion: true });\r\n  }\r\n\r\n  enableIntersection(): void {\r\n    this.config$.nextKeyValue('disabled', false, { skipCoercion: true });\r\n  }\r\n\r\n  getIntersection(): NgxIntersection {\r\n    if (!this._intersection) {\r\n      this._intersection = this._computeIntersection();\r\n    }\r\n\r\n    return this._intersection;\r\n  }\r\n\r\n  refresh(computation: NgxIntersectionComputation): void {\r\n    this._refresh$.next(computation);\r\n  }\r\n\r\n  update(fastUpdate?: boolean): void {\r\n    this.container.updateStickies(fastUpdate);\r\n  }\r\n\r\n  _computeIntersection(): NgxIntersection {\r\n    const config = this.config$.getValue();\r\n\r\n    const elementRect = getElementAbsoluteRect(this.elementRef.nativeElement);\r\n\r\n    return {\r\n      disabled: config.disabled,\r\n      height: elementRect.height,\r\n      top: elementRect.top,\r\n      thresholds: config.thresholds,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Create intersection monitoring observable.\r\n   */\r\n  _createMonitoringObservable(): Observable<boolean> {\r\n    return this.config$.pipe(\r\n      debounceTime(0, animationFrameScheduler),\r\n      map(() => false),\r\n      takeUntil(this._destroyed$),\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Destroy intersection monitoring subscription.\r\n   */\r\n  _destroyMonitoring(): void {\r\n    if (this._monitoring) {\r\n      this._monitoring.unsubscribe();\r\n      this._monitoring = null!;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Init intersection monitoring.\r\n   */\r\n  _initMonitoring(): void {\r\n    if (!this._win || this._monitoring) {\r\n      return;\r\n    }\r\n\r\n    this.ngZone.runOutsideAngular(() => {\r\n      const handleRefreshSubscription = this._refresh$.pipe(\r\n        distinctUntilChanged(),\r\n        takeUntil(this._destroyed$),\r\n      ).subscribe(computation => {\r\n        this._refreshIntersection(computation);\r\n      });\r\n\r\n      const triggerUpdateSubscription = this._createMonitoringObservable().pipe(\r\n        takeUntil(this._destroyed$),\r\n      ).subscribe(fastUpdate => {\r\n        this.update(fastUpdate);\r\n      });\r\n\r\n      this._monitoring = new Subscription();\r\n      this._monitoring.add(handleRefreshSubscription);\r\n      this._monitoring.add(triggerUpdateSubscription);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Refresh intersection with given computation.\r\n   *\r\n   * @param computation Intersection state computation\r\n   */\r\n  _refreshIntersection(computation: NgxIntersectionComputation): void {\r\n    this._intersectionComputation = computation;\r\n    this.intersectionComputation.next(computation);\r\n\r\n    if (computation.state !== this._intersectionState) {\r\n      this.ngZone.run(() => {\r\n        this._intersectionState = computation.state;\r\n        this.intersectionState.next(computation.state);\r\n      });\r\n    }\r\n\r\n    const oldEntry = this._intersectionCrossed;\r\n    const newEntry = computation;\r\n\r\n    const oldRatio = oldEntry ? oldEntry.ratio : 0;\r\n    const newRatio = newEntry.ratio;\r\n\r\n    // ignore when ratios are unchanged\r\n    if (oldEntry && oldRatio === newRatio) {\r\n      return;\r\n    }\r\n\r\n    const crossedThreshold = getCrossedThreshold(computation.snap.intersection.thresholds, oldRatio, newRatio);\r\n\r\n    // ignore when no treshold is crossed\r\n    if (isNaN(crossedThreshold)) {\r\n      return;\r\n    }\r\n\r\n    this._intersectionCrossed = newEntry;\r\n\r\n    this.ngZone.run(() => {\r\n      this._intersectionThreshold = crossedThreshold;\r\n      this.intersectionThreshold.next(crossedThreshold);\r\n\r\n      this.intersection.emit(newEntry);\r\n    });\r\n  }\r\n}\r\n","import {\r\n  NgxStickyBoundary,\r\n  NgxStickyBoundaryController,\r\n  NgxStickyContainerController,\r\n} from './sticky.types';\r\n\r\n\r\n/**\r\n * Abstract sticky boundary controller.\r\n */\r\nexport abstract class NgxStickyBaseBoundaryController implements NgxStickyBoundaryController {\r\n  abstract readonly container: NgxStickyContainerController;\r\n\r\n  abstract beforeRefresh(fastUpdate?: boolean): void;\r\n  abstract getBoundary(): NgxStickyBoundary;\r\n\r\n  updateStickies(fastUpdate?: boolean) {\r\n    this.container.updateStickies(fastUpdate);\r\n  }\r\n}\r\n","import {\r\n  NgxSticky,\r\n  NgxStickyBoundaryController,\r\n  NgxStickyComputation,\r\n  NgxStickyContainerController,\r\n  NgxStickyController,\r\n  NgxStickyState,\r\n} from './sticky.types';\r\n\r\n\r\n/**\r\n * Abstract sticky controller.\r\n */\r\nexport abstract class NgxStickyBaseController implements NgxStickyController {\r\n  abstract readonly boundary?: NgxStickyBoundaryController;\r\n  abstract readonly container: NgxStickyContainerController;\r\n  abstract readonly disabled: boolean;\r\n  abstract readonly state: NgxStickyState;\r\n\r\n  abstract beforeRefresh(fastUpdate?: boolean): void;\r\n  abstract disableSticky(): void;\r\n  abstract enableSticky(): void;\r\n  abstract getSticky(): NgxSticky;\r\n  abstract refresh(computation: NgxStickyComputation): void;\r\n\r\n  update(fastUpdate?: boolean): void {\r\n    // all stickies need to be updated when one of them changed\r\n    this.container.updateStickies(fastUpdate);\r\n  }\r\n}\r\n","import {\r\n  Directive,\r\n  ElementRef,\r\n  Inject,\r\n  Input,\r\n  NgZone,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Optional,\r\n  SimpleChanges,\r\n  forwardRef,\r\n} from '@angular/core';\r\nimport { Observable, Subject, Subscription, animationFrameScheduler } from 'rxjs';\r\nimport { debounceTime, map, takeUntil } from 'rxjs/operators';\r\n\r\nimport { NgxStickyBaseBoundaryController } from './sticky-base-boundary.controller';\r\nimport { NgxStickyContainerDirective } from './sticky-container.directive';\r\nimport { NgxStickyRootContainerController } from './sticky-root-container.controller';\r\nimport { NGX_STICKY_WINDOW } from './sticky.tokens';\r\nimport { NgxStickyBoundary, NgxStickyContainerController } from './sticky.types';\r\nimport { coerceBooleanProperty } from './utils/coercion';\r\nimport { ConfigSubject, ConfigSubjectSchema } from './utils/config-subject';\r\nimport { getElementAbsoluteRect } from './utils/dom';\r\n\r\n\r\nexport interface NgxStickyBoundaryConfig {\r\n  unstacked: boolean;\r\n}\r\n\r\n\r\nexport const NGX_STICKY_BASE_BOUNDARY_CONFIG_SCHEMA: ConfigSubjectSchema<NgxStickyBoundaryConfig> = {\r\n  unstacked: {\r\n    aliasKey: 'stickyUnstacked',\r\n    defaultValue: false,\r\n    coercion: coerceBooleanProperty,\r\n  },\r\n};\r\n\r\n\r\n/**\r\n * Defines a sticky boundary.\r\n */\r\n@Directive({\r\n  selector: '[ngxStickyBoundary], [ngx-sticky-boundary], ngx-sticky-boundary',\r\n  exportAs: 'ngxStickyBoundary',\r\n})\r\nexport class NgxStickyBoundaryDirective extends NgxStickyBaseBoundaryController implements OnChanges, OnDestroy, OnInit {\r\n  static ngAcceptInputType_stickyUnstacked: boolean | string | null | undefined;\r\n\r\n  /**\r\n   * Enable/disable sticky stack inside boudary.\r\n   *\r\n   * Defaults to `false`.\r\n   */\r\n  @Input()\r\n  stickyUnstacked!: boolean;\r\n\r\n  get config(): NgxStickyBoundaryConfig {\r\n    return this.config$.getValue();\r\n  }\r\n\r\n  get container(): NgxStickyContainerController {\r\n    return this._container;\r\n  }\r\n\r\n  /** Inputs config */\r\n  readonly config$ = new ConfigSubject(NGX_STICKY_BASE_BOUNDARY_CONFIG_SCHEMA);\r\n\r\n  /** Boundary line which reflect last call of _computeBoundary() */\r\n  _boundary!: NgxStickyBoundary;\r\n\r\n  /** Boundary container controller */\r\n  readonly _container: NgxStickyContainerController;\r\n\r\n  /** Emits when the component is destroyed. */\r\n  readonly _destroyed$ = new Subject<void>();\r\n\r\n  /** Monitoring subscription which trigger update stickies */\r\n  _monitoring!: Subscription;\r\n\r\n  constructor(\r\n    readonly rootContainer: NgxStickyRootContainerController,\r\n    @Optional() @Inject(forwardRef(() => NgxStickyContainerDirective))\r\n    readonly stickyContainer: NgxStickyContainerController,\r\n    readonly elementRef: ElementRef<HTMLElement>,\r\n    readonly ngZone: NgZone,\r\n    @Inject(NGX_STICKY_WINDOW)\r\n    readonly _win: Window,\r\n  ) {\r\n    super();\r\n\r\n    // use root container when boundary isn't in container\r\n    this._container = stickyContainer || rootContainer;\r\n\r\n    // register boundary in container for first update calls\r\n    this.container.registerBoundary(this);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.config$.nextChanges(changes);\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this._initMonitoring();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.container.unregisterBoundary(this);\r\n\r\n    if (!this._destroyed$.isStopped) {\r\n      this._destroyed$.next();\r\n      this._destroyed$.complete();\r\n    }\r\n\r\n    this._destroyMonitoring();\r\n  }\r\n\r\n  beforeRefresh(fastUpdate?: boolean): void {\r\n    if (!fastUpdate) {\r\n      this._boundary = null!;\r\n    }\r\n  }\r\n\r\n  getBoundary(): NgxStickyBoundary {\r\n    if (!this._boundary) {\r\n      this._boundary = this._computeBoundary();\r\n    }\r\n\r\n    return this._boundary;\r\n  }\r\n\r\n  _computeBoundary(): NgxStickyBoundary {\r\n    const boundary: NgxStickyBoundary = getElementAbsoluteRect(this.elementRef.nativeElement);\r\n\r\n    if (this._win) {\r\n      const boundaryStyle = this._win.getComputedStyle(this.elementRef.nativeElement);\r\n      const paddingTop = parseFloat(boundaryStyle.paddingTop) || 0;\r\n      const paddingBottom = parseFloat(boundaryStyle.paddingBottom) || 0;\r\n\r\n      // subtract paddings from computed boundary line\r\n      boundary.top += paddingTop;\r\n      boundary.height -= paddingTop + paddingBottom;\r\n    }\r\n\r\n    boundary.unstacked = this.config.unstacked;\r\n\r\n    return boundary;\r\n  }\r\n\r\n  _createMonitoringObservable(): Observable<boolean> {\r\n    return this.config$.pipe(\r\n      debounceTime(0, animationFrameScheduler),\r\n      map(() => false),\r\n      takeUntil(this._destroyed$),\r\n    );\r\n  }\r\n\r\n  _destroyMonitoring(): void {\r\n    if (this._monitoring) {\r\n      this._monitoring.unsubscribe();\r\n      this._monitoring = null!;\r\n    }\r\n  }\r\n\r\n  _initMonitoring(): void {\r\n    if (!this._win || this._monitoring) {\r\n      return;\r\n    }\r\n\r\n    this.ngZone.runOutsideAngular(() => {\r\n      this._monitoring = this._createMonitoringObservable().pipe(\r\n        takeUntil(this._destroyed$),\r\n      ).subscribe(fastUpdate => {\r\n        this.updateStickies(fastUpdate);\r\n      });\r\n    });\r\n  }\r\n}\r\n","import { Observable } from 'rxjs';\r\n\r\n\r\n/**\r\n * Create observable which emit image events.\r\n *\r\n * @param element Element\r\n * @returns Observable on image events\r\n */\r\nexport function fromImageEvents(\r\n  element: HTMLElement,\r\n  options?: AddEventListenerOptions,\r\n): Observable<Event & { type: 'load' | 'error'; target: HTMLImageElement; }> {\r\n  return new Observable(subscriber => {\r\n    const images: HTMLImageElement[] = [];\r\n\r\n    const next = (errorOrLoadEvent: Event & { type: 'load' | 'error'; target: HTMLImageElement; }): void => {\r\n      removeImage(errorOrLoadEvent.target as HTMLImageElement);\r\n      subscriber.next(errorOrLoadEvent);\r\n      if (!images.length && !subscriber.closed) {\r\n        subscriber.complete();\r\n      }\r\n    };\r\n\r\n    const onload = (loadEvent: Event): void => {\r\n      next(loadEvent as Event & { type: 'load'; target: HTMLImageElement; });\r\n    };\r\n    const onerror = (errorEvent: Event): void => {\r\n      next(errorEvent as Event & { type: 'error'; target: HTMLImageElement; });\r\n    };\r\n\r\n    const addImage = (image: HTMLImageElement): void => {\r\n      if (image.complete || images.indexOf(image) !== -1) {\r\n        return;\r\n      }\r\n      images.push(image);\r\n      image.addEventListener('load', onload, options);\r\n      image.addEventListener('error', onerror, options);\r\n    };\r\n    const removeImage = (image: HTMLImageElement): void => {\r\n      const imageIndex = images.indexOf(image);\r\n      if (imageIndex === -1) {\r\n        return;\r\n      }\r\n      images.splice(imageIndex, 1);\r\n      image.removeEventListener('load', onload, options);\r\n      image.removeEventListener('error', onerror, options);\r\n    };\r\n\r\n    if (element.tagName === 'IMG' || element.tagName === 'img') {\r\n      addImage(element as HTMLImageElement);\r\n    } else {\r\n      element.querySelectorAll<HTMLImageElement>('img').forEach(addImage);\r\n    }\r\n\r\n    if (!images.length) {\r\n      subscriber.complete();\r\n    }\r\n\r\n    return () => [...images].forEach(removeImage);\r\n  });\r\n}\r\n","import { Observable } from 'rxjs';\r\n\r\n/** Global registry for all dynamically-created, injected media queries. */\r\nconst mediaQueriesForWebkitCompatibility: Set<string> = new Set<string>();\r\n\r\n/** Style tag that holds all of the dynamically-created media queries. */\r\nlet mediaQueryStyleNode: HTMLStyleElement | undefined;\r\n\r\n/**\r\n * Create observable which emit media query events.\r\n *\r\n * @param win Window reference\r\n * @param query Media query\r\n * @returns Observable on media query events\r\n */\r\nexport function fromMediaQuery(win: Window, query: string, nonce?: string): Observable<MediaQueryListEvent> {\r\n  return new Observable(subscriber => {\r\n    if (!win?.matchMedia) {\r\n      return;\r\n    }\r\n\r\n    if (!hasEmptyStyleRule(query) && isEmptyStyleRuleNeeded(win)) {\r\n      createEmptyStyleRule(win, query, nonce);\r\n    }\r\n\r\n    const mql = win.matchMedia(query);\r\n\r\n    const initEvent: MediaQueryListEventInit = {\r\n      matches: mql.matches,\r\n      media: query,\r\n    };\r\n\r\n    const initMqlEvent: MediaQueryListEvent = typeof MediaQueryListEvent !== 'undefined'\r\n      ? new MediaQueryListEvent('change', initEvent)\r\n      : { type: 'change', ...initEvent} as MediaQueryListEvent;\r\n\r\n    subscriber.next(initMqlEvent);\r\n\r\n    const onQueryChange = (mqlEvent: MediaQueryListEvent) => subscriber.next(mqlEvent);\r\n    mql.addListener(onQueryChange);\r\n    return () => mql.removeListener(onQueryChange);\r\n  });\r\n}\r\n\r\nfunction hasEmptyStyleRule(query: string): boolean {\r\n  return mediaQueriesForWebkitCompatibility.has(query);\r\n}\r\n\r\n/**\r\n * Creates an empty stylesheet that is used to work around browser inconsistencies related to\r\n * `matchMedia`. At the time of writing, it handles the following cases:\r\n * 1. On WebKit browsers, a media query has to have at least one rule in order for `matchMedia`\r\n * to fire. We work around it by declaring a dummy stylesheet with a `@media` declaration.\r\n * 2. In some cases Blink browsers will stop firing the `matchMedia` listener if none of the rules\r\n * inside the `@media` match existing elements on the page. We work around it by having one rule\r\n * targeting the `body`. See https://github.com/angular/components/issues/23546.\r\n * @see https://github.com/angular/components/blob/16.2.6/src/cdk/layout/media-matcher.ts#L49-L82\r\n */\r\nfunction createEmptyStyleRule(win: Window, query: string, nonce: string | undefined | null) {\r\n  if (mediaQueriesForWebkitCompatibility.has(query)) {\r\n    return;\r\n  }\r\n\r\n  try {\r\n    if (!mediaQueryStyleNode) {\r\n      mediaQueryStyleNode = win.document.createElement('style');\r\n\r\n      if (nonce) {\r\n        mediaQueryStyleNode.nonce = nonce;\r\n      }\r\n\r\n      mediaQueryStyleNode.setAttribute('type', 'text/css');\r\n      win.document.head!.appendChild(mediaQueryStyleNode);\r\n    }\r\n\r\n    if (mediaQueryStyleNode.sheet) {\r\n      mediaQueryStyleNode.sheet.insertRule(`@media ${query} {body{ }}`, 0);\r\n      mediaQueriesForWebkitCompatibility.add(query);\r\n    }\r\n  } catch (e) {\r\n    console.error(e);\r\n  }\r\n}\r\n\r\n// @see https://github.com/angular/components/blob/16.2.6/src/cdk/platform/platform.ts#L33-L64\r\nexport function isEmptyStyleRuleNeeded(win: Window): boolean {\r\n  if (!win?.navigator?.userAgent) {\r\n    return false;\r\n  }\r\n\r\n  // Whether the current platform supports the V8 Break Iterator. The V8 check\r\n  // is necessary to detect all Blink based browsers.\r\n  let hasV8BreakIterator: boolean;\r\n\r\n  // We need a try/catch around the reference to `Intl`, because accessing it in some cases can\r\n  // cause IE to throw. These cases are tied to particular versions of Windows and can happen if\r\n  // the consumer is providing a polyfilled `Map`. See:\r\n  // https://github.com/Microsoft/ChakraCore/issues/3189\r\n  // https://github.com/angular/components/issues/15687\r\n  try {\r\n    hasV8BreakIterator = !!((win as any).Intl?.v8BreakIterator);\r\n  } catch {\r\n    hasV8BreakIterator = false;\r\n  }\r\n\r\n  /** Whether the current browser is Microsoft Edge. */\r\n  const EDGE: boolean = /(edge)/i.test(win.navigator.userAgent);\r\n\r\n  /** Whether the current rendering engine is Microsoft Trident. */\r\n  const TRIDENT: boolean = /(msie|trident)/i.test(win.navigator.userAgent);\r\n\r\n  // EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.\r\n  /** Whether the current rendering engine is Blink. */\r\n  const BLINK: boolean =\r\n    !!((win as any).chrome || hasV8BreakIterator) && !!(win as any).CSS && EDGE && TRIDENT;\r\n\r\n  // Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to\r\n  // ensure that Webkit runs standalone and is not used as another engine's base.\r\n  /** Whether the current rendering engine is WebKit. */\r\n  const WEBKIT: boolean =\r\n    /AppleWebKit/i.test(win.navigator.userAgent) && !BLINK && !EDGE && !TRIDENT;\r\n\r\n  return WEBKIT || BLINK;\r\n}\r\n","import { Directive, HostBinding, Input } from '@angular/core';\r\n\r\nimport { coerceNumberProperty } from './utils';\r\n\r\n@Directive({\r\n  selector: '[ngxStickySpot], [ngx-sticky-spot], ngx-sticky-spot',\r\n  exportAs: 'ngxStickySpot',\r\n})\r\nexport class NgxStickySpotDirective {\r\n  @HostBinding('class.ngx-sticky-spot')\r\n  readonly cssClassStickySpot = true;\r\n\r\n  @HostBinding('style.position')\r\n  readonly cssStylePosition = 'absolute';\r\n\r\n  @HostBinding('style.height.px')\r\n  @Input()\r\n  get stickySpotHeight(): number { return this._stickySpotHeight; }\r\n  set stickySpotHeight(value: number) { this._stickySpotHeight = coerceNumberProperty(value); }\r\n\r\n  private _stickySpotHeight = 1;\r\n}\r\n","import {\r\n  AfterViewInit,\r\n  Directive,\r\n  ElementRef,\r\n  EventEmitter,\r\n  HostBinding,\r\n  Inject,\r\n  Input,\r\n  NgZone,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Optional,\r\n  Output,\r\n  Renderer2,\r\n  SimpleChanges,\r\n  SkipSelf,\r\n  forwardRef,\r\n  isDevMode,\r\n} from '@angular/core';\r\nimport { Observable, Subject, Subscription, animationFrameScheduler, merge } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map, takeUntil } from 'rxjs/operators';\r\n\r\nimport { NgxStickyBaseController } from './sticky-base.controller';\r\nimport { NgxStickyBoundaryDirective } from './sticky-boundary.directive';\r\nimport { NgxStickyContainerDirective } from './sticky-container.directive';\r\nimport { NgxStickyRootContainerController } from './sticky-root-container.controller';\r\nimport { coerceStickyDirection, coerceStickyPosition, getStuckedPositionTop } from './sticky.helpers';\r\nimport { NGX_STICKY_WINDOW } from './sticky.tokens';\r\nimport {\r\n  NgxSticky,\r\n  NgxStickyBoundaryController,\r\n  NgxStickyComputation,\r\n  NgxStickyContainerController,\r\n  NgxStickyController,\r\n  NgxStickyDirection,\r\n  NgxStickyPosition,\r\n  NgxStickyState,\r\n} from './sticky.types';\r\nimport { coerceBooleanProperty, coerceNumberProperty } from './utils/coercion';\r\nimport { ConfigSubject, ConfigSubjectSchema } from './utils/config-subject';\r\nimport { getElementAbsoluteRect, getElementRelativeRect, setElementStyles } from './utils/dom';\r\nimport { fromImageEvents } from './utils/from-image-events';\r\n\r\n\r\n/**\r\n * Interface for a sticky style.\r\n */\r\nexport interface NgxStickyElementStyle extends Partial<Record<keyof CSSStyleDeclaration, string>> {\r\n  // [prop: string]: string;\r\n  width: string;\r\n  position: string;\r\n  top: string;\r\n  right: string;\r\n  bottom: string;\r\n  left: string;\r\n  cssFloat: string;\r\n  margin: string;\r\n  marginTop: string;\r\n  marginRight: string;\r\n  marginBottom: string;\r\n  marginLeft: string;\r\n}\r\n\r\n/**\r\n * Interface for a sticky ghost style.\r\n */\r\nexport interface NgxStickyGhostStyle extends Partial<Record<keyof CSSStyleDeclaration, string>> {\r\n  // [prop: string]: string;\r\n  height: string;\r\n  maxHeight: string;\r\n  minHeight: string;\r\n  width: string;\r\n  maxWidth: string;\r\n  minWidth: string;\r\n  boxSizing: string;\r\n  cssFloat: string;\r\n  position: string;\r\n  top: string;\r\n  right: string;\r\n  bottom: string;\r\n  left: string;\r\n  borderTop: string;\r\n  borderBottom: string;\r\n  borderLeft: string;\r\n  borderRight: string;\r\n  marginTop: string;\r\n  marginRight: string;\r\n  marginBottom: string;\r\n  marginLeft: string;\r\n  paddingTop: string;\r\n  paddingBottom: string;\r\n  paddingLeft: string;\r\n  paddingRight: string;\r\n}\r\n\r\nexport interface NgxStickyConfig {\r\n  classes: boolean;\r\n  disabled: boolean;\r\n  direction: NgxStickyDirection;\r\n  height: number;\r\n  // orbit: boolean;\r\n  position: NgxStickyPosition;\r\n  spacer: HTMLElement | null;\r\n  spot: HTMLElement | null;\r\n  spotHeight: number;\r\n}\r\n\r\n\r\nexport const NGX_STICKY_BASE_CONFIG_SCHEMA: ConfigSubjectSchema<NgxStickyConfig> = {\r\n  classes: {\r\n    aliasKey: 'stickyClasses',\r\n    defaultValue: false,\r\n    coercion: coerceBooleanProperty,\r\n  },\r\n  disabled: {\r\n    aliasKey: 'stickyDisabled',\r\n    defaultValue: false,\r\n    coercion: coerceBooleanProperty,\r\n  },\r\n  direction: {\r\n    aliasKey: 'stickyDirection',\r\n    defaultValue: 'down',\r\n    coercion: coerceStickyDirection,\r\n  },\r\n  height: {\r\n    aliasKey: 'stickyHeight',\r\n    defaultValue: 0,\r\n    coercion: coerceNumberProperty,\r\n  },\r\n  // orbit: {\r\n  //   aliasKey: 'stickyOrbit',\r\n  //   defaultValue: false,\r\n  //   coercion: coerceBooleanProperty,\r\n  // },\r\n  position: {\r\n    aliasKey: 'stickyPosition',\r\n    defaultValue: 'top',\r\n    coercion: coerceStickyPosition,\r\n  },\r\n  spacer: {\r\n    aliasKey: 'stickySpacer',\r\n    defaultValue: null,\r\n  },\r\n  spot: {\r\n    aliasKey: 'stickySpot',\r\n    defaultValue: null,\r\n  },\r\n  spotHeight: {\r\n    aliasKey: 'stickySpotHeight',\r\n    defaultValue: 0,\r\n    coercion: coerceNumberProperty,\r\n  },\r\n};\r\n\r\n\r\n/**\r\n * Defines a sticky.\r\n */\r\n@Directive({\r\n  selector: '[ngxSticky], [ngx-sticky], ngx-sticky',\r\n  exportAs: 'ngxSticky',\r\n})\r\nexport class NgxStickyDirective extends NgxStickyBaseController implements AfterViewInit, OnChanges, OnDestroy {\r\n  static ngAcceptInputType_stickyClasses: boolean | string | null | undefined;\r\n  static ngAcceptInputType_stickyDirection: NgxStickyDirection | string | null | undefined;\r\n  static ngAcceptInputType_stickyDisabled: boolean | string | null | undefined;\r\n  static ngAcceptInputType_stickyHeight: string | number | null | undefined;\r\n  static ngAcceptInputType_stickyPosition: NgxStickyPosition | string | null | undefined;\r\n  static ngAcceptInputType_stickySpotHeight: string | number | null | undefined;\r\n\r\n  /**\r\n   * Binding sticky classes.\r\n   *\r\n   * Defaults to `false`.\r\n   */\r\n  @Input()\r\n  stickyClasses!: boolean;\r\n\r\n  /**\r\n   * Direction of the sticky; one of 'up' or 'down'.\r\n   *\r\n   * Defaults to `'down'`.\r\n   */\r\n  @Input()\r\n  stickyDirection!: NgxStickyDirection;\r\n\r\n  /**\r\n   * Disable sticky.\r\n   *\r\n   * Defaults to `false`.\r\n   */\r\n  @Input()\r\n  stickyDisabled!: boolean;\r\n\r\n  /**\r\n   * Force element height when calculate sticky element height.\r\n   */\r\n  @Input()\r\n  stickyHeight!: number;\r\n\r\n  // /**\r\n  //  * Indicate sticky element is an orbit.\r\n  //  *\r\n  //  * An orbit is a sticky element which isn't visible until\r\n  //  * it's sticked.\r\n  //  *\r\n  //  * Generally an orbit spot on another element to be sticked.\r\n  //  *\r\n  //  * Defaults to `false`.\r\n  //  */\r\n  // @Input()\r\n  // stickyOrbit: boolean;\r\n\r\n  /**\r\n   * Position of the sticky; one of 'top' or 'bottom'.\r\n   *\r\n   * Defaults to `'top'`.\r\n   */\r\n  @Input()\r\n  stickyPosition!: NgxStickyPosition;\r\n\r\n  /**\r\n   * Sticky spacer.\r\n   *\r\n   * Defaults to `null`.\r\n   */\r\n  @Input()\r\n  stickySpacer!: HTMLElement | null;\r\n\r\n  /**\r\n   * Reference to an element used to determine sticky state.\r\n   *\r\n   * The sticky directive will stick element only when spot\r\n   * isn't visible.\r\n   *\r\n   * Defaults to `null`.\r\n   */\r\n  @Input()\r\n  stickySpot!: HTMLElement | null;\r\n\r\n  /**\r\n   * Force spot height when calculate sticky spot height.\r\n   */\r\n  @Input()\r\n  stickySpotHeight!: number;\r\n\r\n  /**\r\n   * Emit sticky computation.\r\n   */\r\n  @Output()\r\n  readonly stickyComputation = new EventEmitter<NgxStickyComputation>();\r\n\r\n  /**\r\n   * Emit sticky state.\r\n   */\r\n  @Output()\r\n  readonly stickyState = new EventEmitter<NgxStickyState>();\r\n\r\n  @HostBinding('attr.data-sticky-state')\r\n  get attrDataStickyState() { return !this.stickyParent ? this.state : null; }\r\n\r\n  @HostBinding('class.ngx-sticky')\r\n  get cssClassSticky() { return !this.stickyParent && this.config.classes; }\r\n\r\n  @HostBinding('class.ngx-sticky--normal')\r\n  get cssClassStickyNormal() { return this.cssClassSticky && this.state === 'normal'; }\r\n\r\n  @HostBinding('class.ngx-sticky--sticked')\r\n  get cssClassStickySticked() { return this.cssClassSticky && this.state === 'sticked'; }\r\n\r\n  @HostBinding('class.ngx-sticky--stucked')\r\n  get cssClassStickyStucked() { return this.cssClassSticky && this.state === 'stucked'; }\r\n\r\n  @HostBinding('class.ngx-sticky--disabled')\r\n  get cssClassStickyDisabled() { return this.cssClassSticky && this.disabled; }\r\n\r\n  // @HostBinding('class.ngx-sticky--spot')\r\n  // get cssClassStickySpot() { return this.cssClassSticky && !!this.config.spot; }\r\n\r\n  // @HostBinding('class.ngx-sticky--position-top')\r\n  // get cssClassStickyPositionTop() { return this.cssClassSticky && !isStickyPositionBottom(this.config.position); }\r\n\r\n  // @HostBinding('class.ngx-sticky--position-bottom')\r\n  // get cssClassStickyPositionBottom() { return this.cssClassSticky && isStickyPositionBottom(this.config.position); }\r\n\r\n  // @HostBinding('class.ngx-sticky--direction-up')\r\n  // get cssClassStickyDirectionUp() { return this.cssClassSticky && !isStickyDirectionDown(this.config.direction); }\r\n\r\n  // @HostBinding('class.ngx-sticky--direction-down')\r\n  // get cssClassStickydirectionDown() { return this.cssClassSticky && isStickyDirectionDown(this.config.direction); }\r\n\r\n  get boundary(): NgxStickyBoundaryController {\r\n    return this._boundary as NgxStickyBoundaryController;\r\n  }\r\n\r\n  get container(): NgxStickyContainerController {\r\n    return this._container;\r\n  }\r\n\r\n  get config(): NgxStickyConfig {\r\n    return this.config$.getValue();\r\n  }\r\n\r\n  get disabled(): boolean {\r\n    return this.config.disabled;\r\n  }\r\n\r\n  /**\r\n   * State of the sticky.\r\n   */\r\n  get state(): NgxStickyState {\r\n    return this._stickyState;\r\n  }\r\n\r\n  /** Inputs config */\r\n  readonly config$ = new ConfigSubject<NgxStickyConfig>(NGX_STICKY_BASE_CONFIG_SCHEMA);\r\n\r\n  /** Sticky container controller */\r\n  readonly _container: NgxStickyContainerController;\r\n\r\n  /** Sticky boundary controller */\r\n  readonly _boundary?: NgxStickyBoundaryController;\r\n\r\n  /** Emits when the component is destroyed. */\r\n  readonly _destroyed$ = new Subject<void>();\r\n\r\n  /** Sticky element style original */\r\n  _elementOriginStyle!: NgxStickyElementStyle;\r\n\r\n  /** Monitoring subscription which trigger update stickies and handle refresh */\r\n  _monitoring!: Subscription;\r\n\r\n  /** Sticky spacer generated */\r\n  _spacerGenerated!: HTMLElement;\r\n\r\n  /** Sticky which reflect last call of _computeSticky() */\r\n  _sticky!: NgxSticky;\r\n\r\n  /** Emits when refresh() is called */\r\n  readonly _refresh$ = new Subject<NgxStickyComputation>();\r\n\r\n  /** Sticky computation which reflect last call of _refreshSticky()  */\r\n  _stickyComputation!: NgxStickyComputation;\r\n\r\n  /** Sticky element state which reflect last call of _refreshStickyElement() */\r\n  _stickyElementState: NgxStickyState = null!;\r\n\r\n  /** Sticky element state which reflect last sticky state output */\r\n  _stickyState: NgxStickyState = null!;\r\n\r\n  constructor(\r\n    readonly rootContainer: NgxStickyRootContainerController,\r\n    @Optional() @Inject(forwardRef(() => NgxStickyContainerDirective))\r\n    readonly stickyContainer: NgxStickyContainerController,\r\n    @Optional() @Inject(forwardRef(() => NgxStickyBoundaryDirective))\r\n    readonly stickyBoundary: NgxStickyBoundaryController,\r\n    @SkipSelf() @Optional() @Inject(forwardRef(() => NgxStickyDirective))\r\n    readonly stickyParent: NgxStickyController,\r\n    readonly elementRef: ElementRef<HTMLElement>,\r\n    readonly renderer: Renderer2,\r\n    // readonly changeDetectorRef: ChangeDetectorRef,\r\n    readonly ngZone: NgZone,\r\n    @Inject(NGX_STICKY_WINDOW)\r\n    readonly _win: Window,\r\n  ) {\r\n    super();\r\n\r\n    // use root container when sticky isn't in container\r\n    this._container = stickyContainer || rootContainer;\r\n\r\n    // ensure sticky boundary is in same container\r\n    this._boundary = stickyBoundary && stickyBoundary.container === this._container ? stickyBoundary : null!;\r\n\r\n    // register sticky in container only if isn't in another sticky\r\n    if (!this.stickyParent) {\r\n      // register in parent container for first update calls\r\n      this.container.registerSticky(this);\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.config$.nextChanges(changes);\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    // avoid sticky initialization when sticky has a parent\r\n    if (this._preventNestedStickyError()) {\r\n      return;\r\n    }\r\n\r\n    this._initMonitoring();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.container.unregisterSticky(this);\r\n\r\n    if (!this._destroyed$.isStopped) {\r\n      this._destroyed$.next();\r\n      this._destroyed$.complete();\r\n    }\r\n\r\n    this._destroyMonitoring();\r\n  }\r\n\r\n  beforeRefresh(fastUpdate?: boolean): void {\r\n    if (!fastUpdate) {\r\n      this._sticky = null!;\r\n\r\n      // IMPORTANT: refresh sticky element to its normal state here helps\r\n      // `NgxStickyBaseContainerController::updateStickies` to process full update\r\n      // with all its stickies being freshly repainted with the right element height.\r\n      this._refreshStickyElement(null!);\r\n    }\r\n  }\r\n\r\n  disableSticky(): void {\r\n    this.config$.nextKeyValue('disabled', true, { skipCoercion: true });\r\n  }\r\n\r\n  enableSticky(): void {\r\n    this.config$.nextKeyValue('disabled', false, { skipCoercion: true });\r\n  }\r\n\r\n  getSticky(): NgxSticky {\r\n    if (!this._sticky) {\r\n      this._sticky = this._computeSticky();\r\n    }\r\n\r\n    return this._sticky;\r\n  }\r\n\r\n  refresh(computation: NgxStickyComputation): void {\r\n    this._refresh$.next(computation);\r\n  }\r\n\r\n  _computeSticky(): NgxSticky {\r\n    // IMPORTANT: refresh sticky element to its normal state is required to compute repainted element height.\r\n    this._refreshStickyElement(null!);\r\n    this._refreshStickyElement('normal');\r\n\r\n    const config = this.config$.getValue();\r\n\r\n    // element and spot rects which reflects last screen repaint\r\n    const elementRect = getElementAbsoluteRect(this.elementRef.nativeElement);\r\n    const spotRect = config.spot ? getElementAbsoluteRect(config.spot) : null;\r\n\r\n    if (config.height) {\r\n      elementRect.height = config.height;\r\n    }\r\n\r\n    if (spotRect && config.spotHeight) {\r\n      spotRect.height = config.spotHeight;\r\n    }\r\n\r\n    return {\r\n      disabled: config.disabled,\r\n      boundary: this.boundary ? this.boundary.getBoundary() : null!,\r\n      direction: config.direction,\r\n      height: elementRect.height,\r\n      position: config.position,\r\n      top: elementRect.top,\r\n      spot: spotRect!,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Create sticky monitoring observable.\r\n   */\r\n  _createMonitoringObservable(): Observable<boolean> {\r\n    return merge(\r\n      this.config$,\r\n      fromImageEvents(this.elementRef.nativeElement),\r\n      ...(this.config.spot ? [fromImageEvents(this.config.spot)] : []),\r\n    ).pipe(\r\n      debounceTime(0, animationFrameScheduler),\r\n      map(() => false),\r\n      takeUntil(this._destroyed$),\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Destroy sticky monitoring subscription.\r\n   */\r\n  _destroyMonitoring(): void {\r\n    if (this._monitoring) {\r\n      this._monitoring.unsubscribe();\r\n      this._monitoring = null!;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns styles of the given state.\r\n   *\r\n   * `computation` is required when `state` is `\"sticked\"` or `\"stucked\"`.\r\n   *\r\n   * @param state Sticky state\r\n   * @param computation Sticky state computation\r\n   * @returns Styles of the sticky state\r\n   */\r\n  _getStickyElementStyle(state: NgxStickyState, computation?: NgxStickyComputation): Partial<NgxStickyElementStyle> {\r\n    const win = this._win;\r\n\r\n    if (!win || !state) {\r\n      return null!;\r\n    }\r\n\r\n    const ghost = this.config.spacer || this._spacerGenerated;\r\n    const ghostParent = ghost.offsetParent as HTMLElement;\r\n    const ghostParentIsRootElement = ghostParent === win.document.body || ghostParent === win.document.documentElement;\r\n\r\n    // when state is normal (computation isn't needed)\r\n    if (state === 'normal') {\r\n      const ghostRelativeRect = getElementRelativeRect(win, ghost);\r\n      const ghostStyle = win.getComputedStyle(ghost);\r\n      const ghostBorderBox = ghostStyle.boxSizing === 'border-box';\r\n\r\n      let elementWidth = ghostRelativeRect.width;\r\n\r\n      if (!ghostBorderBox) {\r\n        elementWidth +=\r\n          - ((parseFloat(ghostStyle.borderLeft) || 0) + (parseFloat(ghostStyle.borderRight) || 0))\r\n          - ((parseFloat(ghostStyle.paddingLeft) || 0) + (parseFloat(ghostStyle.paddingRight) || 0));\r\n      }\r\n\r\n      let elementTop = ghostRelativeRect.top;\r\n      let elementLeft = ghostRelativeRect.left;\r\n\r\n      if (ghostParentIsRootElement) {\r\n        if (this.container !== this.rootContainer) {\r\n          const ghostRect = getElementAbsoluteRect(ghost);\r\n          const viewportTop = this.container.getViewportTop();\r\n\r\n          elementTop = ghostRect.top - viewportTop;\r\n        }\r\n\r\n        elementTop += win.document.documentElement.offsetTop;\r\n        elementLeft += win.document.documentElement.offsetLeft;\r\n      }\r\n\r\n      const styles = {\r\n        position: 'absolute',\r\n        width: `${elementWidth}px`,\r\n        top: `${elementTop}px`,\r\n        right: '',\r\n        bottom: '',\r\n        left: `${elementLeft}px`,\r\n        float: '',\r\n        margin: '0px',\r\n      };\r\n\r\n      return styles;\r\n    }\r\n\r\n    const { container, stickyComputed, viewportHeight } = computation!.snap;\r\n\r\n    // when state is sticked\r\n    if (state === 'sticked') {\r\n      const positionBottom = stickyComputed.positionBottom;\r\n\r\n      let elementTop: number;\r\n      let elementLeft: number;\r\n\r\n      if (this.container !== this.rootContainer) {\r\n        const ghostRelativeRect = getElementRelativeRect(win, ghost);\r\n\r\n        elementLeft = ghostRelativeRect.left;\r\n\r\n        if (ghostParentIsRootElement) {\r\n          elementTop = container.top;\r\n\r\n          elementTop += win.document.documentElement.offsetTop;\r\n          elementLeft += win.document.documentElement.offsetLeft;\r\n        } else {\r\n          const ghostParentRect = getElementAbsoluteRect(ghostParent);\r\n\r\n          elementTop = computation!.viewportTop - ghostParentRect.top;\r\n        }\r\n\r\n        if (positionBottom) {\r\n          elementTop += viewportHeight - stickyComputed.height - computation!.offsetSticked - computation!.offsetStucked;\r\n        } else {\r\n          elementTop += computation!.offsetSticked + computation!.offsetStucked;\r\n        }\r\n\r\n        return {\r\n          position: 'absolute',\r\n          top: `${elementTop}px`,\r\n          bottom: '',\r\n          left: `${elementLeft}px`,\r\n        };\r\n      } else {\r\n        const ghostRect = getElementAbsoluteRect(ghost);\r\n\r\n        elementTop = computation!.offsetSticked + computation!.offsetStucked;\r\n        elementLeft = ghostRect.left + win.document.documentElement.offsetLeft;\r\n\r\n        return {\r\n          position: 'fixed',\r\n          top: !positionBottom ? `${elementTop}px` : '',\r\n          bottom: positionBottom ? `${elementTop}px` : '',\r\n          left: `${elementLeft}px`,\r\n        };\r\n      }\r\n    }\r\n\r\n    // when state is stucked\r\n    if (state === 'stucked') {\r\n      const ghostRect = getElementAbsoluteRect(ghost);\r\n\r\n      let elementTop: number;\r\n      let elementLeft: number;\r\n\r\n      elementTop = getStuckedPositionTop(computation!);\r\n\r\n      elementLeft = ghostRect.left;\r\n\r\n      if (ghostParentIsRootElement) {\r\n        if (this.container !== this.rootContainer) {\r\n          // we can't use computation.viewportTop because it's absolute viewport top\r\n          const relativeViewportTop = this.container.getViewportTop();\r\n\r\n          elementTop -= relativeViewportTop;\r\n        }\r\n\r\n        elementTop += win.document.documentElement.offsetTop;\r\n        elementLeft += win.document.documentElement.offsetLeft;\r\n      } else {\r\n        const ghostParentRect = getElementAbsoluteRect(ghostParent);\r\n\r\n        elementTop -= ghostParentRect.top;\r\n        elementLeft -= ghostParentRect.left;\r\n      }\r\n\r\n      return {\r\n        position: 'absolute',\r\n        top: `${elementTop}px`,\r\n        bottom: '',\r\n        left: `${elementLeft}px`,\r\n      };\r\n    }\r\n\r\n    // throw new Error(`Invalid state: ${state}`);\r\n    return null!;\r\n  }\r\n\r\n  /**\r\n   * Returns sticky ghost style.\r\n   *\r\n   * @returns Styles of the sticky ghost\r\n   */\r\n  _getStickyGhostStyle(): NgxStickyGhostStyle {\r\n    const stickySpacer = this.config.spacer || this._spacerGenerated;\r\n\r\n    if (!this._win || !stickySpacer) {\r\n      return null!;\r\n    }\r\n\r\n    const element = this.elementRef.nativeElement;\r\n    const elementStyle = this._win.getComputedStyle(element);\r\n    const elementnBorderBox = elementStyle.boxSizing === 'border-box';\r\n\r\n    let ghostHeight = element.offsetHeight;\r\n\r\n    // subtract borders and paddings when element isn't border-boxed\r\n    if (!elementnBorderBox) {\r\n      ghostHeight +=\r\n        // subtract vertical borders\r\n        - (parseFloat(elementStyle.borderTopWidth) || 0)\r\n        - (parseFloat(elementStyle.borderBottomWidth) || 0)\r\n        // subtract vertical paddings\r\n        - (parseFloat(elementStyle.paddingTop) || 0)\r\n        - (parseFloat(elementStyle.paddingBottom) || 0);\r\n    }\r\n\r\n    const styles: NgxStickyGhostStyle = {\r\n      // width: element.style.width || elementStyle.width,\r\n      width: elementStyle.width,\r\n      maxWidth: elementStyle.maxWidth,\r\n      minWidth: elementStyle.minWidth,\r\n      height: `${ghostHeight}px`,\r\n      maxHeight: `${ghostHeight}px`,\r\n      minHeight: `${ghostHeight}px`,\r\n      position: elementStyle.position,\r\n      boxSizing: elementStyle.boxSizing,\r\n      cssFloat: elementStyle.cssFloat,\r\n      top: elementStyle.top,\r\n      right: elementStyle.right,\r\n      bottom: elementStyle.bottom,\r\n      left: elementStyle.left,\r\n      borderTop: elementStyle.borderTop,\r\n      borderBottom: elementStyle.borderBottom,\r\n      borderLeft: elementStyle.borderLeft,\r\n      borderRight: elementStyle.borderRight,\r\n      // borderColor: 'transparent',\r\n      marginTop: elementStyle.marginTop,\r\n      marginBottom: elementStyle.marginBottom,\r\n      marginLeft: elementStyle.marginLeft,\r\n      marginRight: elementStyle.marginRight,\r\n      paddingTop: elementStyle.paddingTop,\r\n      paddingBottom: elementStyle.paddingBottom,\r\n      paddingLeft: elementStyle.paddingLeft,\r\n      paddingRight: elementStyle.paddingRight,\r\n    };\r\n\r\n    // if (this.config.orbit) {\r\n    //   styles.position = 'absolute';\r\n    //   // styles.width = element.style.width || elementStyle.width;\r\n    //   styles.width = elementStyle.width;\r\n    // }\r\n\r\n    return styles;\r\n  }\r\n\r\n  /**\r\n   * Hides sticky ghost.\r\n   */\r\n  _hideStickyGhost(): void {\r\n    const ghost = this.config.spacer || this._spacerGenerated;\r\n\r\n    if (!ghost) {\r\n      return;\r\n    }\r\n\r\n    this.renderer.setStyle(ghost, 'display', 'none');\r\n  }\r\n\r\n  /**\r\n   * Init sticky monitoring.\r\n   */\r\n  _initMonitoring(): void {\r\n    if (!this._win || this._monitoring) {\r\n      return;\r\n    }\r\n\r\n    this.ngZone.runOutsideAngular(() => {\r\n      const handleRefreshSubscription = this._refresh$.pipe(\r\n        distinctUntilChanged(),\r\n        takeUntil(this._destroyed$),\r\n      ).subscribe(computation => {\r\n        this._refreshSticky(computation);\r\n      });\r\n\r\n      const triggerUpdateSubscription = this._createMonitoringObservable().pipe(\r\n        takeUntil(this._destroyed$),\r\n      ).subscribe(fastUpdate => {\r\n        this.update(fastUpdate);\r\n      });\r\n\r\n      this._monitoring = new Subscription();\r\n      this._monitoring.add(handleRefreshSubscription);\r\n      this._monitoring.add(triggerUpdateSubscription);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Inserts sticky ghost generated.\r\n   */\r\n  _insertStickyGhostGenerated(): void {\r\n    if (this._spacerGenerated) {\r\n      return;\r\n    }\r\n\r\n    const element = this.elementRef.nativeElement;\r\n\r\n    const ghost = this.renderer.createElement(element.tagName);\r\n    this.renderer.addClass(ghost, 'ngx-sticky-spacer');\r\n    // this.renderer.setStyle(ghost, 'borderStyle', 'solid');\r\n    // this.renderer.setStyle(ghost, 'borderColor', 'transparent');\r\n    this.renderer.insertBefore(element.parentElement, ghost, element);\r\n\r\n    this._spacerGenerated = ghost;\r\n  }\r\n\r\n  /**\r\n   * Log nested sticky error and returns `true` when sticky is in another sticky.\r\n   *\r\n   * @returns `true` when sticky is in another sticky\r\n   */\r\n  _preventNestedStickyError(): boolean {\r\n    if (!this.stickyParent) {\r\n      return false;\r\n    }\r\n\r\n    const nestedStickyError = new Error('Nested sticky is not support. Sticky will not work.');\r\n\r\n    if (isDevMode()) {\r\n      console.error(nestedStickyError);\r\n    } else {\r\n      console.warn(nestedStickyError);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Refresh sticky with given computation.\r\n   *\r\n   * @param computation Sticky state computation\r\n   */\r\n  _refreshSticky(computation: NgxStickyComputation): void {\r\n    if (\r\n      // refresh sticky when state has changed\r\n      computation.state !== this._stickyElementState\r\n      // or when sticky is in container (other than window)\r\n      || this.container !== this.rootContainer\r\n    ) {\r\n      this._refreshStickyElement(computation.state, computation);\r\n    }\r\n\r\n    this._stickyComputation = computation;\r\n    this.stickyComputation.next(computation);\r\n\r\n    if (computation.state === this._stickyState) {\r\n      return;\r\n    }\r\n\r\n    this.ngZone.run(() => {\r\n      this._stickyState = computation.state;\r\n      this.stickyState.next(computation.state);\r\n\r\n      // this.changeDetectorRef.detectChanges();\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Refreshs sticky element style.\r\n   *\r\n   * @param state Sticky state\r\n   * @param computation Sticky state computation when state is sticked or stucked\r\n   */\r\n  _refreshStickyElement(state: NgxStickyState, computation?: NgxStickyComputation): void {\r\n    if (!this._win) {\r\n      return;\r\n    }\r\n\r\n    // hide ghost and refresh original style when state is null\r\n    if (!state) {\r\n      this._stickyElementState = null!;\r\n\r\n      this._hideStickyGhost();\r\n      this._restoreStickyElementStyle();\r\n\r\n      return;\r\n    }\r\n\r\n    this._stickyElementState = state;\r\n\r\n    this._saveStickyElementStyle();\r\n    this._showStickyGhost();\r\n\r\n    const elementStyle = this._getStickyElementStyle(state, computation);\r\n\r\n    setElementStyles(this.renderer, this.elementRef.nativeElement, elementStyle);\r\n  }\r\n\r\n  /**\r\n   * Refreshs sticky ghost.\r\n   */\r\n  _refreshStickyGhost(): void {\r\n    const ghost = this.config.spacer || this._spacerGenerated;\r\n    const ghostStyle = this._getStickyGhostStyle();\r\n\r\n    setElementStyles(this.renderer, ghost, ghostStyle);\r\n  }\r\n\r\n  /**\r\n   * Restore original styles of the sticky.\r\n   */\r\n  _restoreStickyElementStyle(): void {\r\n    setElementStyles(this.renderer, this.elementRef.nativeElement, this._elementOriginStyle);\r\n    this._elementOriginStyle = null!;\r\n  }\r\n\r\n  /**\r\n   * Saves origin styles of the sticky.\r\n   */\r\n  _saveStickyElementStyle(): void {\r\n    if (!this._elementOriginStyle) {\r\n      this._elementOriginStyle = {\r\n        position: this.elementRef.nativeElement.style.position,\r\n        width: this.elementRef.nativeElement.style.width,\r\n        top: this.elementRef.nativeElement.style.top,\r\n        right: this.elementRef.nativeElement.style.right,\r\n        bottom: this.elementRef.nativeElement.style.bottom,\r\n        left: this.elementRef.nativeElement.style.left,\r\n        cssFloat: this.elementRef.nativeElement.style.cssFloat,\r\n        margin: this.elementRef.nativeElement.style.margin,\r\n        marginTop: this.elementRef.nativeElement.style.marginTop,\r\n        marginRight: this.elementRef.nativeElement.style.marginRight,\r\n        marginBottom: this.elementRef.nativeElement.style.marginBottom,\r\n        marginLeft: this.elementRef.nativeElement.style.marginLeft,\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Shows sticky ghost.\r\n   */\r\n  _showStickyGhost(): void {\r\n    if (!this.config.spacer && !this._spacerGenerated) {\r\n      this._insertStickyGhostGenerated();\r\n      this._refreshStickyGhost();\r\n\r\n      return;\r\n    } else if (this.config.spacer && this._spacerGenerated) {\r\n      this._spacerGenerated.remove();\r\n      this._spacerGenerated = null!;\r\n    }\r\n\r\n    const ghost = this.config.spacer || this._spacerGenerated;\r\n\r\n    if (ghost.style.display === 'none') {\r\n      this.renderer.setStyle(ghost, 'display', 'block');\r\n      this._refreshStickyGhost();\r\n    }\r\n  }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { NgxInViewportDirective } from './in-viewport.directive';\r\nimport { NgxStickyBoundaryDirective } from './sticky-boundary.directive';\r\nimport { NgxStickyContainerDirective } from './sticky-container.directive';\r\nimport { NgxStickySpotDirective } from './sticky-spot.directive';\r\nimport { NgxStickyDirective } from './sticky.directive';\r\n\r\n/**\r\n * Adds sticky directives and providers.\r\n *\r\n * Managing sticky elements is one of the hardest parts of building web applications.\r\n *\r\n * The NgxStickyModule allows to manage sticky elements in the best way.\r\n *\r\n * @example\r\n * NgxStickyModule can be imported multiple times: once per lazily-loaded bundle.\r\n *\r\n * ```\r\n * @NgModule({\r\n *   imports: [ NgxStickyModule ]\r\n * })\r\n * class MyNgModule {}\r\n * ```\r\n */\r\n@NgModule({\r\n  declarations: [\r\n    NgxInViewportDirective,\r\n    NgxStickyBoundaryDirective,\r\n    NgxStickyContainerDirective,\r\n    NgxStickyDirective,\r\n    NgxStickySpotDirective,\r\n  ],\r\n  exports: [\r\n    NgxInViewportDirective,\r\n    NgxStickyBoundaryDirective,\r\n    NgxStickyContainerDirective,\r\n    NgxStickyDirective,\r\n    NgxStickySpotDirective,\r\n  ],\r\n})\r\nexport class NgxStickyModule { }\r\n","/*\r\n * Public API Surface of @enten/ngx-sticky\r\n */\r\n\r\nexport * from './lib/in-viewport.directive';\r\nexport * from './lib/sticky-base-boundary.controller';\r\nexport * from './lib/sticky-base-container.controller';\r\nexport * from './lib/sticky-base-container.directive';\r\nexport * from './lib/sticky-base.controller';\r\nexport * from './lib/sticky-boundary.directive';\r\nexport * from './lib/sticky-container.directive';\r\nexport * from './lib/sticky-engine';\r\nexport * from './lib/sticky-root-container.controller';\r\nexport * from './lib/sticky-spot.directive';\r\nexport * from './lib/sticky.directive';\r\nexport * from './lib/sticky.helpers';\r\nexport * from './lib/sticky.module';\r\nexport * from './lib/sticky.tokens';\r\nexport * from './lib/sticky.types';\r\nexport * from './lib/utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxStickyRootContainerController","i2.NgxStickyEngine"],"mappings":"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"}