{"version":3,"file":"ngwr-virtual-scroll.mjs","sources":["../../../projects/lib/virtual-scroll/virtual-scroll.ts","../../../projects/lib/virtual-scroll/virtual-scroll.html","../../../projects/lib/virtual-scroll/ngwr-virtual-scroll.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n  Component,\n  TemplateRef,\n  type TrackByFunction,\n  ViewEncapsulation,\n  computed,\n  contentChild,\n  input,\n  viewChild,\n} from '@angular/core';\n\n/**\n * Fixed-size virtual scroll viewport.\n *\n * Thin wrapper around CDK's `cdk-virtual-scroll-viewport` with ngwr\n * theming and sensible buffer defaults. Project a single template — it's\n * called per item with `let-item let-index=\"index\"`.\n *\n * @example\n * ```html\n * <wr-virtual-scroll [items]=\"rows\" [itemSize]=\"32\" [height]=\"320\">\n *   <ng-template let-row let-i=\"index\">\n *     <div class=\"row\">{{ i }}. {{ row.name }}</div>\n *   </ng-template>\n * </wr-virtual-scroll>\n * ```\n *\n * @see https://ngwr.dev/components/virtual-scroll\n */\n@Component({\n  selector: 'wr-virtual-scroll',\n  templateUrl: './virtual-scroll.html',\n  styleUrl: './virtual-scroll.scss',\n  encapsulation: ViewEncapsulation.None,\n  imports: [ScrollingModule, NgTemplateOutlet],\n  host: { class: 'wr-virtual-scroll' },\n})\nexport class WrVirtualScroll<T = unknown> {\n  /** Items to render. */\n  readonly items = input.required<readonly T[]>();\n\n  /** Per-item pixel height. All rows must be the same height. @default 32 */\n  readonly itemSize = input(32, {\n    transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 32)),\n  });\n\n  /**\n   * Viewport height. Pass a number (`px`) or any CSS length string\n   * (`'80vh'`, `'40rem'`). @default 256\n   */\n  readonly height = input<number | string>(256);\n\n  /**\n   * Pixels of rendered content kept above + below the viewport. CDK\n   * keeps adding rows until at least this many pixels are buffered.\n   * @default itemSize * 4\n   */\n  readonly minBufferPx = input<number | undefined>(undefined);\n\n  /**\n   * Maximum pixels of buffered content before CDK starts recycling rows.\n   * Must be ≥ `minBufferPx`. @default itemSize * 8\n   */\n  readonly maxBufferPx = input<number | undefined>(undefined);\n\n  /**\n   * `trackBy` function for the inner `*cdkVirtualFor`. Defaults to\n   * identity (recreates rows when the item reference changes).\n   */\n  readonly trackBy = input<TrackByFunction<T>>((_, item) => item);\n\n  protected readonly rowTemplate = contentChild.required(TemplateRef<{ $implicit: T; index: number }>);\n\n  protected readonly viewport = viewChild.required(CdkVirtualScrollViewport);\n\n  protected readonly resolvedHeight = computed(() => {\n    const h = this.height();\n    return typeof h === 'number' ? `${h}px` : h;\n  });\n\n  protected readonly resolvedMinBuffer = computed(() => this.minBufferPx() ?? this.itemSize() * 4);\n  protected readonly resolvedMaxBuffer = computed(() => this.maxBufferPx() ?? this.itemSize() * 8);\n\n  /** Scroll a specific index into view. Mirrors the CDK API. */\n  scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\n    this.viewport().scrollToIndex(index, behavior);\n  }\n\n  /** Scroll to a pixel offset. */\n  scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\n    this.viewport().scrollToOffset(offset, behavior);\n  }\n\n  /** Manually trigger size recheck (e.g. after host resize outside ResizeObserver). */\n  checkViewportSize(): void {\n    this.viewport().checkViewportSize();\n  }\n}\n","<cdk-virtual-scroll-viewport\n  class=\"wr-virtual-scroll__viewport\"\n  [itemSize]=\"itemSize()\"\n  [minBufferPx]=\"resolvedMinBuffer()\"\n  [maxBufferPx]=\"resolvedMaxBuffer()\"\n  [style.height]=\"resolvedHeight()\"\n>\n  <ng-container *cdkVirtualFor=\"let item of items(); let i = index; trackBy: trackBy()\">\n    <ng-container *ngTemplateOutlet=\"rowTemplate(); context: { $implicit: item, index: i }\" />\n  </ng-container>\n</cdk-virtual-scroll-viewport>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAAA;;;;;AAKG;AAgBH;;;;;;;;;;;;;;;;;AAiBG;MASU,eAAe,CAAA;;IAEjB,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAgB;;IAGtC,QAAQ,GAAG,KAAK,CAAC,EAAE,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAC1B,SAAS,EAAE,CAAC,CAAU,KAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAA,CAC3E;AAEF;;;AAGG;IACM,MAAM,GAAG,KAAK,CAAkB,GAAG;+EAAC;AAE7C;;;;AAIG;IACM,WAAW,GAAG,KAAK,CAAqB,SAAS;oFAAC;AAE3D;;;AAGG;IACM,WAAW,GAAG,KAAK,CAAqB,SAAS;oFAAC;AAE3D;;;AAGG;IACM,OAAO,GAAG,KAAK,CAAqB,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI;gFAAC;IAE5C,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAC,WAA4C,EAAC;AAEjF,IAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC;AAEvD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,GAAG,CAAC;IAC7C,CAAC;uFAAC;AAEiB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;0FAAC;AAC7E,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;0FAAC;;AAGhG,IAAA,aAAa,CAAC,KAAa,EAAE,QAAA,GAA2B,MAAM,EAAA;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC;IAChD;;AAGA,IAAA,cAAc,CAAC,MAAc,EAAE,QAAA,GAA2B,MAAM,EAAA;QAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;IAClD;;IAGA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE;IACrC;uGA3DW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,GAkC6B,WAA4C,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAElD,wBAAwB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnF3E,mdAWA,EAAA,MAAA,EAAA,CAAA,yUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDiCY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAGhC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAR3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,aAAA,EAGd,iBAAiB,CAAC,IAAI,WAC5B,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAA,IAAA,EACtC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAA,QAAA,EAAA,mdAAA,EAAA,MAAA,EAAA,CAAA,yUAAA,CAAA,EAAA;AAoCmB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,WAA4C,uFAElD,wBAAwB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEnF3E;;AAEG;;;;"}