{"version":3,"file":"ngx-ui-scroll.mjs","sources":["../../../scroller/src/ui-scroll.version.ts","../../../scroller/src/ui-scroll.component.ts","../../../scroller/src/ui-scroll.component.html","../../../scroller/src/ui-scroll.directive.ts","../../../scroller/src/ui-scroll.module.ts","../../../scroller/src/ui-scroll.datasource.ts","../../../scroller/ngx-ui-scroll.ts"],"sourcesContent":["export default {\r\n  name: 'ngx-ui-scroll',\r\n  version: '4.1.0'\r\n};\r\n","import {\r\n  Component,\r\n  TemplateRef,\r\n  ElementRef,\r\n  ChangeDetectionStrategy,\r\n  NgZone,\r\n  inject,\r\n  DestroyRef,\r\n  signal,\r\n  afterNextRender\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\n\r\nimport { IDatasource, Workflow, Item } from './vscroll';\r\nimport { IDatasource as IAngularDatasource, RoutinesClassType } from './types';\r\nimport consumer from './ui-scroll.version';\r\n\r\n@Component({\r\n  selector: '[ui-scroll]',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  templateUrl: './ui-scroll.component.html',\r\n  imports: [NgTemplateOutlet],\r\n  standalone: true\r\n})\r\nexport class UiScrollComponent<Data = unknown> {\r\n  // template, datasource and Routines come from the directive\r\n  // `template` is a signal to trigger view updates whenever changes.\r\n  readonly template = signal<TemplateRef<unknown> | null>(null);\r\n  public datasource!: IAngularDatasource<Data>;\r\n  public Routines?: RoutinesClassType;\r\n\r\n  // the only template variable\r\n  readonly items = signal<Item<Data>[]>([]);\r\n\r\n  // Component-Workflow integration\r\n  public workflow!: Workflow<Data>;\r\n\r\n  private ngZone = inject(NgZone);\r\n  private element = inject(ElementRef).nativeElement;\r\n\r\n  constructor() {\r\n    inject(DestroyRef).onDestroy(() => this.workflow?.dispose());\r\n\r\n    afterNextRender(() => {\r\n      // The workflow should be created outside of the Angular zone because it's causing many\r\n      // change detection cycles. It runs its `init()` function in a `setTimeout` task, which\r\n      // then sets up the `scroll` listener. The `scroll` event listener would force Angular to\r\n      // run `tick()` any time the `scroll` task is invoked. We don't care about `scroll` events\r\n      // since they're handled internally by `vscroll`. We still run change detection manually\r\n      // tho when the `run` function is invoked.\r\n      // `scroll` events may be also unpatched through zone.js flags:\r\n      // `(window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll']`.\r\n      // Having `runOutsideAngular` guarantees we're responsible for running change detection\r\n      // only when it's \"required\" (when `items` are updated and the template should be updated too).\r\n      this.workflow = this.ngZone.runOutsideAngular(\r\n        () =>\r\n          new Workflow<Data>({\r\n            consumer,\r\n            element: this.element,\r\n            datasource: this.datasource as unknown as IDatasource<Data>,\r\n            run: (items: Item<Data>[]) => {\r\n              if (!items.length && !this.items.length) {\r\n                return;\r\n              }\r\n              // Updating a signal would schedule a change detection in both zoneless and zone.js modes.\r\n              this.ngZone.run(() => this.items.set(items));\r\n            },\r\n            ...(this.Routines ? { Routines: this.Routines } : {})\r\n          })\r\n      );\r\n    });\r\n  }\r\n}\r\n","<div data-padding-backward></div>\r\n@for (item of items(); track item) {\r\n<div\r\n  [attr.data-sid]=\"item.$index\"\r\n  [style.position]=\"item.invisible ? 'fixed' : null\"\r\n  [style.left]=\"item.invisible ? '-99999px' : null\"\r\n>\r\n  <ng-template\r\n    [ngTemplateOutlet]=\"template()\"\r\n    [ngTemplateOutletContext]=\"{\r\n      $implicit: item.data,\r\n      index: item.$index,\r\n      odd: item.$index % 2,\r\n      even: !(item.$index % 2)\r\n    }\"\r\n  ></ng-template>\r\n</div>\r\n}\r\n<div data-padding-forward></div>\r\n","import {\r\n  Directive,\r\n  Input,\r\n  TemplateRef,\r\n  ViewContainerRef,\r\n  OnInit\r\n} from '@angular/core';\r\n\r\nimport { UiScrollComponent } from './ui-scroll.component';\r\nimport { IDatasource, RoutinesClassType } from './types';\r\n\r\n@Directive({\r\n  selector: '[uiScroll][uiScrollOf]',\r\n  standalone: true\r\n})\r\nexport class UiScrollDirective<ItemData = unknown> implements OnInit {\r\n  private datasource!: IDatasource<ItemData>;\r\n  private Routines?: RoutinesClassType;\r\n\r\n  constructor(\r\n    private templateRef: TemplateRef<unknown>,\r\n    private viewContainer: ViewContainerRef\r\n  ) { }\r\n\r\n  @Input() set uiScrollOf(datasource: IDatasource<ItemData>) {\r\n    this.datasource = datasource;\r\n  }\r\n\r\n  @Input() set uiScrollRoutines(Routines: RoutinesClassType) {\r\n    this.Routines = Routines;\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    const componentRef = this.viewContainer.createComponent(UiScrollComponent);\r\n    componentRef.instance.datasource = this.datasource as IDatasource;\r\n    componentRef.instance.template.set(this.templateRef);\r\n    componentRef.instance.Routines = this.Routines;\r\n  }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { UiScrollComponent } from './ui-scroll.component';\r\nimport { UiScrollDirective } from './ui-scroll.directive';\r\n\r\nconst imports = [UiScrollComponent, UiScrollDirective];\r\n\r\n@NgModule({\r\n  imports: imports,\r\n  exports: imports\r\n})\r\nexport class UiScrollModule {}\r\n","import { BehaviorSubject, Subject } from 'rxjs';\r\n\r\nimport {\r\n  makeDatasource,\r\n  AdapterPropName,\r\n  EMPTY_ITEM,\r\n  IReactivePropConfig,\r\n  IAdapterConfig,\r\n  IAdapterItem\r\n} from './vscroll';\r\nimport { AngularDatasourceClass } from './types';\r\n\r\nconst getBooleanSubjectPropConfig = (): IReactivePropConfig => ({\r\n  source: new Subject<boolean>(),\r\n  emit: (source, value) => (source as Subject<boolean>).next(value as boolean)\r\n});\r\n\r\nconst getItemBehaviorSubjectPropConfig = (): IReactivePropConfig => ({\r\n  source: new BehaviorSubject<IAdapterItem>(EMPTY_ITEM),\r\n  emit: (source, value) =>\r\n    (source as BehaviorSubject<IAdapterItem>).next(value as IAdapterItem)\r\n});\r\n\r\nconst getAdapterConfig = (): IAdapterConfig => ({\r\n  mock: false,\r\n  reactive: {\r\n    [AdapterPropName.init$]: getBooleanSubjectPropConfig(),\r\n    [AdapterPropName.isLoading$]: getBooleanSubjectPropConfig(),\r\n    [AdapterPropName.loopPending$]: getBooleanSubjectPropConfig(),\r\n    [AdapterPropName.firstVisible$]: getItemBehaviorSubjectPropConfig(),\r\n    [AdapterPropName.lastVisible$]: getItemBehaviorSubjectPropConfig(),\r\n    [AdapterPropName.bof$]: getBooleanSubjectPropConfig(),\r\n    [AdapterPropName.eof$]: getBooleanSubjectPropConfig(),\r\n    [AdapterPropName.paused$]: getBooleanSubjectPropConfig()\r\n  }\r\n});\r\n\r\nconst AngularDatasource = makeDatasource(\r\n  getAdapterConfig\r\n) as AngularDatasourceClass;\r\n\r\nexport { AngularDatasource as Datasource };\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}