{"version":3,"file":"talenra-ngx-base-scroll-container.mjs","sources":["../../../projects/ngx-base/scroll-container/src/scroll-container/scroll-container.types.ts","../../../projects/ngx-base/scroll-container/src/scroll-container/scroll-container.component.ts","../../../projects/ngx-base/scroll-container/src/scroll-container/scroll-container.component.html","../../../projects/ngx-base/scroll-container/talenra-ngx-base-scroll-container.ts"],"sourcesContent":["/** @internal */\nexport enum ScrollContainerAxis {\n  x = 'x',\n  y = 'y',\n}\n\n/**\n * Dimensions of the scroll container, scroll offset and content.\n */\nexport interface ScrollContainerDimensions {\n  /**\n   * Height of the scroll container\n   */\n  offsetHeight: number;\n  /**\n   * Width of the scroll container\n   */\n  offsetWidth: number;\n  /**\n   * Vertical scroll offset\n   */\n  scrollTop: number;\n  /**\n   * Horizontal scroll offset\n   */\n  scrollLeft: number;\n  /**\n   * Full height of the content\n   */\n  scrollHeight: number;\n  /**\n   * Full width of the content\n   */\n  scrollWidth: number;\n}\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  DestroyRef,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  numberAttribute,\n  OnDestroy,\n  Output,\n  ViewEncapsulation,\n} from '@angular/core';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport SimpleBar from 'simplebar/dist/simplebar-core.esm';\nimport { fromEvent } from 'rxjs';\nimport { debounceTime, tap, throttleTime } from 'rxjs/operators';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ScrollContainerAxis, ScrollContainerDimensions } from './scroll-container.types';\n\n/**\n * Applies styling for the browser's default scrollbars. Does not affect\n * scrolling behaviour.\n *\n * ### Import\n *\n * ```typescript\n * import { ScrollContainerModule } from '@talenra/ngx-base/scroll-container';\n * ```\n *\n * <example-url>../../#/content-control/scroll-container</example-url>\n */\n@Component({\n  selector: 'talenra-scroll-container',\n  templateUrl: './scroll-container.component.html',\n  styleUrls: ['../../../../../node_modules/simplebar/src/simplebar.css', './scroll-container.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    'attr.data-simplebar': '',\n    '[class.use-overlay]': 'useOverlay',\n    '[class.use-offset]': 'useOffset',\n  },\n  imports: [CdkScrollable],\n})\nexport class ScrollContainerComponent implements OnDestroy, AfterViewInit {\n  private options = { autoHide: false };\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private SimpleBar: any;\n\n  /**\n   * **Experimental:** Set whether the scrollbar is placed on top of the scrolling content.\n   *\n   * @experimental\n   */\n  @Input({ transform: booleanAttribute })\n  set useOverlay(value: boolean) {\n    this._useOverlay = value;\n    this.changeDetector.markForCheck();\n  }\n  /**\n   * **Experimental:** Get whether the scrollbar is placed on top of the scrolling content.\n   *\n   * @experimental\n   */\n  get useOverlay(): boolean {\n    return this._useOverlay;\n  }\n  private _useOverlay = false;\n\n  /**\n   * Reference to the scroll element. This is the HTML element with the relevant `scrollTop` and `scrollLeft`\n   * properties. It is available after the content is initialized. Use this reference to implement custom scroll\n   * behavior.\n   *\n   * ```typescript\n   * import { ScrollContainerComponent } from '@talenra/ngx-base/scroll-container';\n   *\n   * // ...\n   *\n   * @ViewChild(ScrollContainerComponent)\n   * private scrollContainer!: ScrollContainerComponent;\n   *\n   * ngAfterViewInit(): void {\n   *  // The element is available once the view is initialized\n   *  const elm: HTMLElement = this.scrollContainer.scrollElement;\n   *  // Read relevant properties\n   *  console.log(elm.scrollWidth, elm.clientWidth, elm.scrollLeft, elm.scrollHeight, elm.clientHeight, elm.scrollTop);\n   * }\n   * ```\n   */\n  public scrollElement!: HTMLElement;\n\n  /**\n   * Determines whether the scrollbar has offset (is shorter than the content).\n   */\n  @Input({ transform: booleanAttribute })\n  set useOffset(value: boolean) {\n    this._useOffset = value;\n    this.changeDetector.markForCheck();\n  }\n  /**\n   * Get whether the scrollbar has offset (is shorter than the content).\n   */\n  get useOffset(): boolean {\n    return this._useOffset;\n  }\n  private _useOffset = false;\n\n  /**\n   * Determines how sensitive `updatedScrollYOffset` is triggered. Lower values will trigger earlier. E.g. a value of\n   * `10` will trigger `updatedScrollYOffset` if the scroll-container has a scroll-offset of `10px` or more.\n   */\n  @Input({ transform: numberAttribute }) public scrollYThreshold = 24;\n\n  /**\n   * Triggered whenever the scroll-container's `scrollTop` property exceedes or undercuts `scrollYThreshold` value.\n   * Use this hook if you need to know whether the scroll-container has scroll-offset. Use `scrollYThreshold` to\n   * adjust the sensitivity.\n   */\n  @Output() updatedScrollYOffset = new EventEmitter<boolean>();\n\n  /**\n   * Returns dimensions of the scroll container.\n   */\n  public get dimensions(): ScrollContainerDimensions {\n    const container: HTMLElement = this.elementRef.nativeElement;\n    const content: HTMLElement = this.SimpleBar.getScrollElement();\n    return {\n      offsetHeight: container.offsetHeight,\n      offsetWidth: container.offsetWidth,\n      scrollTop: content.scrollTop,\n      scrollLeft: content.scrollLeft,\n      scrollHeight: content.scrollHeight,\n      scrollWidth: content.scrollWidth,\n    };\n  }\n\n  /**\n   * Sets the vertical scroll offset.\n   */\n  public set scrollTop(offset: number) {\n    this.SimpleBar.getScrollElement().scrollTop = offset;\n  }\n\n  /**\n   * Sets the horizontal scroll offset.\n   */\n  public set scrollLeft(offset: number) {\n    this.SimpleBar.getScrollElement().scrollLeft = offset;\n  }\n\n  /** @internal */\n  public showTrack: { x: boolean; y: boolean } = { x: false, y: false };\n  private hasScrollYOffset = false;\n  private hideTrackItvl: { x: number; y: number } = { x: 0, y: 0 };\n  private trackTimeout: number = 2 * 1000;\n  private lastScrollOffset: { x: number; y: number } = { x: 0, y: 0 };\n\n  private readonly elementRef = inject(ElementRef);\n  private readonly changeDetector = inject(ChangeDetectorRef);\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    // Init simplebar\n    this.SimpleBar = new SimpleBar(this.elementRef?.nativeElement, this.options);\n    // Listen to scroll events\n    // - throttled for performance\n    // - debounced to ensure we still catch the final scroll position\n    this.scrollElement = this.SimpleBar.getScrollElement();\n    fromEvent(this.scrollElement, 'scroll')\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        throttleTime(100),\n        tap(() => this.onScroll()),\n        debounceTime(250),\n        tap(() => this.onScroll())\n      )\n      .subscribe();\n  }\n\n  /**\n   * Some edge cases (e.g. changing the layout programmatically) might require recalculating the scroll logic. For\n   * regular content updated, this is not necessary.\n   *\n   * This is used library internally but not officially exposed in the public API. This might change once we have a\n   * solid use case for it.\n   *\n   * @internal\n   */\n  recalculate(): void {\n    this.SimpleBar.recalculate();\n  }\n\n  private onScroll(): void {\n    // Scrollbar track: Show on scroll, auto-hide delayed\n    const directions = [\n      { key: ScrollContainerAxis.x, edge: 'Left' },\n      { key: ScrollContainerAxis.y, edge: 'Top' },\n    ];\n    directions.forEach((direction) => {\n      const scrollOffset: number =\n        direction.edge === 'Left' ? this.scrollElement.scrollLeft : this.scrollElement.scrollTop;\n      if (scrollOffset !== this.lastScrollOffset[direction.key]) {\n        this.showTrack[direction.key] = true;\n        this.changeDetector.markForCheck();\n        window.clearTimeout(this.hideTrackItvl[direction.key]);\n        this.hideTrackItvl[direction.key] = window.setTimeout(\n          this.hideTrack.bind(this, direction.key),\n          this.trackTimeout\n        );\n        this.lastScrollOffset[direction.key] = scrollOffset;\n      }\n    });\n    // Scroll offset: Trigger updatedScrollYOffset as required\n    if (this.hasScrollYOffset !== this.scrollElement?.scrollTop >= this.scrollYThreshold) {\n      this.hasScrollYOffset = !this.hasScrollYOffset;\n      this.updatedScrollYOffset.emit(this.hasScrollYOffset);\n    }\n  }\n\n  private hideTrack(Axis: ScrollContainerAxis): void {\n    this.showTrack[Axis] = false;\n    this.changeDetector.markForCheck();\n  }\n\n  /** @internal */\n  ngOnDestroy(): void {\n    this.SimpleBar.unMount();\n    this.SimpleBar = null;\n  }\n}\n","<div class=\"simplebar-wrapper\">\n  <div class=\"simplebar-height-auto-observer-wrapper\">\n    <div class=\"simplebar-height-auto-observer\"></div>\n  </div>\n  <div class=\"simplebar-mask\">\n    <div class=\"simplebar-offset\">\n      <div class=\"simplebar-content-wrapper\" cdkScrollable>\n        <div class=\"simplebar-content\">\n          <ng-content />\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"simplebar-placeholder\"></div>\n</div>\n<div class=\"simplebar-track simplebar-horizontal\" [class.show-track]=\"showTrack.x\">\n  <div class=\"simplebar-scrollbar\"></div>\n</div>\n<div class=\"simplebar-track simplebar-vertical\" [class.show-track]=\"showTrack.y\">\n  <div class=\"simplebar-scrollbar\"></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAAA;IACY;AAAZ,CAAA,UAAY,mBAAmB,EAAA;AAC7B,IAAA,mBAAA,CAAA,GAAA,CAAA,GAAA,GAAO;AACP,IAAA,mBAAA,CAAA,GAAA,CAAA,GAAA,GAAO;AACT,CAAC,EAHW,mBAAmB,KAAnB,mBAAmB,GAG9B,EAAA,CAAA,CAAA;;ACqBD;;;;;;;;;;;AAWG;MAcU,wBAAwB,CAAA;AAbrC,IAAA,WAAA,GAAA;AAcU,QAAA,IAAA,CAAA,OAAO,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;QAsB7B,IAAW,CAAA,WAAA,GAAG,KAAK;QAuCnB,IAAU,CAAA,UAAA,GAAG,KAAK;AAE1B;;;AAGG;QAC2C,IAAgB,CAAA,gBAAA,GAAG,EAAE;AAEnE;;;;AAIG;AACO,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,YAAY,EAAW;;QAiCrD,IAAS,CAAA,SAAA,GAA+B,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;QAC7D,IAAgB,CAAA,gBAAA,GAAG,KAAK;QACxB,IAAa,CAAA,aAAA,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACxD,QAAA,IAAA,CAAA,YAAY,GAAW,CAAC,GAAG,IAAI;QAC/B,IAAgB,CAAA,gBAAA,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAElD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,UAAU,GAAe,MAAM,CAAC,UAAU,CAAC;AAuE7D;AAtLC;;;;AAIG;IACH,IACI,UAAU,CAAC,KAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;;AAEpC;;;;AAIG;AACH,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW;;AA2BzB;;AAEG;IACH,IACI,SAAS,CAAC,KAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;;AAEpC;;AAEG;AACH,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;;AAiBxB;;AAEG;AACH,IAAA,IAAW,UAAU,GAAA;AACnB,QAAA,MAAM,SAAS,GAAgB,IAAI,CAAC,UAAU,CAAC,aAAa;QAC5D,MAAM,OAAO,GAAgB,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;QAC9D,OAAO;YACL,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC;;AAGH;;AAEG;IACH,IAAW,SAAS,CAAC,MAAc,EAAA;QACjC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,SAAS,GAAG,MAAM;;AAGtD;;AAEG;IACH,IAAW,UAAU,CAAC,MAAc,EAAA;QAClC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,UAAU,GAAG,MAAM;;;IAevD,eAAe,GAAA;;AAEb,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC;;;;QAI5E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;AACtD,QAAA,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ;AACnC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,YAAY,CAAC,GAAG,CAAC,EACjB,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,EAC1B,YAAY,CAAC,GAAG,CAAC,EACjB,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE3B,aAAA,SAAS,EAAE;;AAGhB;;;;;;;;AAQG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;IAGtB,QAAQ,GAAA;;AAEd,QAAA,MAAM,UAAU,GAAG;YACjB,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAC5C,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;SAC5C;AACD,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;YAC/B,MAAM,YAAY,GAChB,SAAS,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS;YAC1F,IAAI,YAAY,KAAK,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;gBACzD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI;AACpC,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAClC,gBAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACtD,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EACxC,IAAI,CAAC,YAAY,CAClB;gBACD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY;;AAEvD,SAAC,CAAC;;AAEF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,aAAa,EAAE,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACpF,YAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB;YAC9C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;;;AAIjD,IAAA,SAAS,CAAC,IAAyB,EAAA;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;;;IAIpC,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;8GAzLZ,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAUf,gBAAgB,CAyChB,EAAA,SAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,gBAAgB,8DAiBhB,eAAe,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtHrC,ovBAqBA,EAAA,MAAA,EAAA,CAAA,i2FAAA,EAAA,ouCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED2BY,aAAa,EAAA,QAAA,EAAA,mCAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAEZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAbpC,SAAS;+BACE,0BAA0B,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAC/B,IAAA,EAAA;AACJ,wBAAA,qBAAqB,EAAE,EAAE;AACzB,wBAAA,qBAAqB,EAAE,YAAY;AACnC,wBAAA,oBAAoB,EAAE,WAAW;qBAClC,EACQ,OAAA,EAAA,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,ovBAAA,EAAA,MAAA,EAAA,CAAA,i2FAAA,EAAA,ouCAAA,CAAA,EAAA;8BAapB,UAAU,EAAA,CAAA;sBADb,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;gBA0ClC,SAAS,EAAA,CAAA;sBADZ,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;gBAiBQ,gBAAgB,EAAA,CAAA;sBAA7D,KAAK;uBAAC,EAAE,SAAS,EAAE,eAAe,EAAE;gBAO3B,oBAAoB,EAAA,CAAA;sBAA7B;;;AE7HH;;AAEG;;;;"}