ng-virtual-list 16.12.3 → 16.12.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/esm2022/lib/components/ng-list-item/const/index.mjs +2 -1
  2. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +1 -4
  3. package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +3 -1
  4. package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +5 -15
  5. package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +16 -2
  6. package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +19 -9
  7. package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +7 -11
  8. package/esm2022/lib/core/interfaces/metrics.mjs +1 -1
  9. package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +1 -1
  10. package/esm2022/lib/core/track-box.mjs +16 -8
  11. package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +6 -6
  12. package/esm2022/lib/models/render-item-config.model.mjs +1 -1
  13. package/esm2022/lib/models/render-item-measures.model.mjs +1 -1
  14. package/esm2022/lib/ng-virtual-list.component.mjs +89 -85
  15. package/esm2022/lib/utils/animator/animator.mjs +23 -15
  16. package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +1 -1
  17. package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +1 -1
  18. package/esm2022/lib/utils/animator/types/easing.mjs +1 -1
  19. package/esm2022/lib/utils/event-emitter/event-emitter.mjs +2 -2
  20. package/esm2022/lib/utils/event-emitter/interfaces/event-emitter.mjs +1 -1
  21. package/fesm2022/ng-virtual-list.mjs +178 -146
  22. package/fesm2022/ng-virtual-list.mjs.map +1 -1
  23. package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +0 -3
  24. package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +1 -6
  25. package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +7 -1
  26. package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +4 -0
  27. package/lib/components/ng-scroller/ng-scroller.component.d.ts +1 -3
  28. package/lib/core/interfaces/metrics.d.ts +2 -0
  29. package/lib/core/interfaces/recalculate-metrics-options.d.ts +1 -0
  30. package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +2 -2
  31. package/lib/models/render-item-config.model.d.ts +4 -0
  32. package/lib/models/render-item-measures.model.d.ts +4 -0
  33. package/lib/ng-virtual-list.component.d.ts +0 -1
  34. package/lib/utils/animator/animator.d.ts +3 -2
  35. package/lib/utils/animator/interfaces/animator-params.d.ts +1 -1
  36. package/lib/utils/animator/interfaces/animator-update-data.d.ts +1 -1
  37. package/lib/utils/animator/types/easing.d.ts +1 -1
  38. package/lib/utils/event-emitter/event-emitter.d.ts +1 -1
  39. package/lib/utils/event-emitter/interfaces/event-emitter.d.ts +1 -1
  40. package/package.json +1 -1
@@ -327,7 +327,7 @@ const VISIBILITY_HIDDEN = 'hidden';
327
327
  const SIZE_100_PERSENT = '100%';
328
328
  const SIZE_AUTO = 'auto';
329
329
  const UNSET$5 = 'unset';
330
- const LEFT$2 = 'left';
330
+ const LEFT$3 = 'left';
331
331
  const RIGHT$1 = 'right';
332
332
  const POSITION$1 = 'position';
333
333
  const POSITION_RELATIVE = 'relative';
@@ -496,6 +496,7 @@ const DEFAULT_TEMPLATE_CONTEXT = {
496
496
  fullSize: false,
497
497
  totalItems: 0,
498
498
  grabbing: false,
499
+ inverted: false,
499
500
  },
500
501
  reseted: false,
501
502
  index: -1,
@@ -1921,7 +1922,7 @@ class ScrollEvent {
1921
1922
 
1922
1923
  /**
1923
1924
  * Event emitter
1924
- * @link https://github.com/DjonnyX/ng-virtual-list/blob/main/library/src/utils/event-emitter/event-emitter.ts
1925
+ * @link https://github.com/DjonnyX/ng-virtual-list/blob/16.x/library/src/utils/event-emitter/event-emitter.ts
1925
1926
  * @author Evgenii Alexandrovich Grebennikov
1926
1927
  * @email djonnyx@gmail.com
1927
1928
  */
@@ -2831,7 +2832,7 @@ class TrackBox extends CacheMap {
2831
2832
  * Calculates list metrics
2832
2833
  */
2833
2834
  recalculateMetrics(options) {
2834
- const { alignment, fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, minItemSize, maxItemSize, bufferSize: minBufferSize, scrollSize, stickyEnabled, itemConfigMap, enabledBufferOptimization, previousTotalSize, snapToItem, snapToItemAlign, deletedItemsMap, itemTransform } = options, roundedScrollSize = Math.round(scrollSize);
2835
+ const { alignment, fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, minItemSize, maxItemSize, bufferSize: minBufferSize, scrollSize, stickyEnabled, itemConfigMap, enabledBufferOptimization, previousTotalSize, snapToItem, snapToItemAlign, deletedItemsMap, inverted, itemTransform } = options, roundedScrollSize = Math.round(scrollSize);
2835
2836
  const trackBy = this._trackingPropertyName, bufferSize = Math.max(minBufferSize, this._bufferSize), { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width, totalLength = collection.length, typicalItemSize = itemSize, w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height, map = this._map, snapshot = this._snapshot, divides = this._divides, stickyPos = Math.floor(scrollSize) + this._scrollStartOffset, leftItemsOrRowsWeights = [], isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)
2836
2837
  || (typeof fromItemId === 'string' && fromItemId > '-1');
2837
2838
  let leftItemsOffset = 0, rightItemsOffset = 0;
@@ -3284,6 +3285,7 @@ class TrackBox extends CacheMap {
3284
3285
  rightItemLength,
3285
3286
  rightItemsWeight,
3286
3287
  scrollSize: actualScrollSize,
3288
+ maxScrollSize: totalSize,
3287
3289
  leftSizeOfAddedItems,
3288
3290
  sizeProperty,
3289
3291
  stickyEnabled,
@@ -3298,6 +3300,7 @@ class TrackBox extends CacheMap {
3298
3300
  isUpdating,
3299
3301
  snapToItem,
3300
3302
  snapToItemAlign,
3303
+ inverted,
3301
3304
  itemTransform,
3302
3305
  };
3303
3306
  return metrics;
@@ -3349,7 +3352,7 @@ class TrackBox extends CacheMap {
3349
3352
  return false;
3350
3353
  }
3351
3354
  generateDisplayCollection(items, actualItems, itemConfigMap, metrics) {
3352
- const { width, height, normalizedItemWidth, normalizedItemHeight, dynamicSize, divides, itemsOnDisplayLength, itemsFromStartToScrollEnd, isVertical, leftLayoutOffset: layoutOffset, leftLayoutIndexOffset: layoutIndexOffset, renderItems: renderItemsLength, scrollSize, sizeProperty, stickyEnabled, stickyPos, startPosition, totalLength, startIndex, typicalItemSize, minItemSize, maxItemSize, snapToItem, snapToItemAlign, itemTransform, } = metrics, displayItems = [];
3355
+ const { width, height, normalizedItemWidth, normalizedItemHeight, dynamicSize, divides, itemsOnDisplayLength, itemsFromStartToScrollEnd, isVertical, leftLayoutOffset: layoutOffset, leftLayoutIndexOffset: layoutIndexOffset, renderItems: renderItemsLength, scrollSize, maxScrollSize, sizeProperty, stickyEnabled, stickyPos, startPosition, totalLength, startIndex, typicalItemSize, minItemSize, maxItemSize, snapToItem, snapToItemAlign, inverted, itemTransform, } = metrics, displayItems = [];
3353
3356
  if (items.length) {
3354
3357
  const trackBy = this._trackingPropertyName, actualSnippedPosition = stickyPos, isSnappingMethodAdvanced = this._isSnappingMethodAdvanced, deltaOffet = (isSnappingMethodAdvanced ? scrollSize : 0), scrollDirection = this._scrollDirection, boundsSize = isVertical ? height : width, actualEndSnippedPosition = scrollSize + boundsSize - this._scrollEndOffset;
3355
3358
  let pos = startPosition, renderItems = renderItemsLength, stickyItem, nextSticky, stickyItemIndex = -1, nexstStickyItemIndex = -1, stickyItemSize = 0, endStickyItem, nextEndSticky, endStickyItemIndex = -1, endStickyItemSize = 0;
@@ -3389,6 +3392,7 @@ class TrackBox extends CacheMap {
3389
3392
  position: pos,
3390
3393
  boundsSize,
3391
3394
  scrollSize,
3395
+ maxScrollSize,
3392
3396
  absoluteStartPosition,
3393
3397
  absoluteStartPositionPercent,
3394
3398
  absoluteEndPosition,
@@ -3419,6 +3423,7 @@ class TrackBox extends CacheMap {
3419
3423
  tabIndex: i - layoutIndexOffset,
3420
3424
  divides,
3421
3425
  opacity: 1,
3426
+ inverted,
3422
3427
  zIndex: Z_INDEX_1,
3423
3428
  };
3424
3429
  const itemData = collectionItem;
@@ -3465,6 +3470,7 @@ class TrackBox extends CacheMap {
3465
3470
  position: pos,
3466
3471
  boundsSize,
3467
3472
  scrollSize,
3473
+ maxScrollSize,
3468
3474
  absoluteStartPosition,
3469
3475
  absoluteStartPositionPercent,
3470
3476
  absoluteEndPosition,
@@ -3501,6 +3507,7 @@ class TrackBox extends CacheMap {
3501
3507
  tabIndex: i - layoutIndexOffset,
3502
3508
  divides,
3503
3509
  opacity: 1,
3510
+ inverted,
3504
3511
  zIndex: Z_INDEX_1,
3505
3512
  };
3506
3513
  const itemData = collectionItem;
@@ -3561,6 +3568,7 @@ class TrackBox extends CacheMap {
3561
3568
  position: pos,
3562
3569
  boundsSize,
3563
3570
  scrollSize,
3571
+ maxScrollSize,
3564
3572
  absoluteStartPosition,
3565
3573
  absoluteStartPositionPercent,
3566
3574
  absoluteEndPosition,
@@ -3599,6 +3607,7 @@ class TrackBox extends CacheMap {
3599
3607
  opacity: 1,
3600
3608
  zIndex: Z_INDEX_0,
3601
3609
  fullSize,
3610
+ inverted,
3602
3611
  };
3603
3612
  if (snapped) {
3604
3613
  config.zIndex = Z_INDEX_2;
@@ -3743,18 +3752,18 @@ class TrackBox extends CacheMap {
3743
3752
  let first = null, last = null;
3744
3753
  if (!!components) {
3745
3754
  for (const comp of components) {
3746
- const id = comp.instance.itemId ?? null, isVertical = comp.instance.item?.config?.isVertical, x = comp.instance.item?.measures?.x ?? 0, y = comp.instance.item?.measures?.y ?? 0, isFirst = comp.instance.item?.config?.isFirst ?? false, isLast = comp.instance.item?.config?.isLast ?? false, { width, height } = comp.instance.getBounds(), pos = position;
3755
+ const id = comp.instance.itemId ?? null, isVertical = comp.instance.item?.config?.isVertical, inverted = comp.instance.item?.config.inverted ?? false, maxScrollSize = comp.instance.item?.measures.maxScrollSize ?? 0, { width, height } = comp.instance.getBounds(), x = comp.instance.item?.measures?.x ?? 0, xx = inverted ? (maxScrollSize - x) - width : x, y = comp.instance.item?.measures?.y ?? 0, isFirst = comp.instance.item?.config?.isFirst ?? false, isLast = comp.instance.item?.config?.isLast ?? false, pos = position;
3747
3756
  if (isVertical && (pos >= y && pos < y + height)) {
3748
3757
  return { id, x, y, width, height, isFirst, isLast };
3749
3758
  }
3750
- else if (!isVertical && (pos >= x && pos < x + width)) {
3751
- return { id, x, y, width, height, isFirst, isLast };
3759
+ else if (!isVertical && (pos >= xx && pos < xx + width)) {
3760
+ return { id, x: xx, y, width, height, isFirst, isLast };
3752
3761
  }
3753
3762
  if (isFirst) {
3754
- first = { id, x, y, width, height, isFirst, isLast };
3763
+ first = { id, x: xx, y, width, height, isFirst, isLast };
3755
3764
  }
3756
3765
  else if (isLast) {
3757
- last = { id, x, y, width, height, isFirst, isLast };
3766
+ last = { id, x: xx, y, width, height, isFirst, isLast };
3758
3767
  }
3759
3768
  }
3760
3769
  }
@@ -3954,7 +3963,7 @@ const easeLinear = (t) => {
3954
3963
 
3955
3964
  /**
3956
3965
  * Animator
3957
- * @link https://github.com/DjonnyX/ng-virtual-list/blob/main/library/src/utils/animator/animator.ts
3966
+ * @link https://github.com/DjonnyX/ng-virtual-list/blob/16.x/library/src/utils/animator/animator.ts
3958
3967
  * @author Evgenii Alexandrovich Grebennikov
3959
3968
  * @email djonnyx@gmail.com
3960
3969
  */
@@ -3972,10 +3981,15 @@ class Animator {
3972
3981
  _diff = 0;
3973
3982
  _startValue = 0;
3974
3983
  _endValue = 0;
3975
- updateTo(value) {
3976
- this._endValue = value;
3977
- this._diff = this._endValue - this._startValue;
3978
- return this.hasAnimation();
3984
+ _prevPos = 0;
3985
+ updateTo(end) {
3986
+ if (this.hasAnimation()) {
3987
+ this._startValue = this._prevPos;
3988
+ this._endValue = end;
3989
+ this._diff = this._endValue - this._startValue;
3990
+ return true;
3991
+ }
3992
+ return false;
3979
3993
  }
3980
3994
  animate(params) {
3981
3995
  this.stop();
@@ -3985,7 +3999,8 @@ class Animator {
3985
3999
  this._startValue = startValue;
3986
4000
  this._endValue = endValue;
3987
4001
  const startTime = performance.now();
3988
- let isCanceled = false, prevPos = startValue, startPosDelta = 0, delta = 0, prevTime = startTime, isFinished = false;
4002
+ let isCanceled = false, startPosDelta = 0, delta = 0, prevTime = startTime, isFinished = false;
4003
+ this._prevPos = startValue;
3989
4004
  this._diff = this._endValue - this._startValue;
3990
4005
  const step = (currentTime) => {
3991
4006
  if (id !== this._currentId) {
@@ -3996,34 +4011,36 @@ class Animator {
3996
4011
  }
3997
4012
  const cPos = getPropValue?.() || 0;
3998
4013
  let startDelta = 0;
3999
- if (cPos !== prevPos) {
4000
- startDelta = cPos - prevPos;
4014
+ if (cPos !== this._prevPos) {
4015
+ startDelta = cPos - this._prevPos;
4001
4016
  startPosDelta += startDelta;
4002
4017
  }
4003
- const elapsed = currentTime - startTime, progress = this._startValue === endValue ? 1 : Math.min(duration > 0 ? elapsed / duration : 0, 1), easedProgress = easingFunction(progress), val = (withDelta ? startPosDelta : 0) + this._startValue + this._diff * easedProgress, currentValue = val, t = performance.now();
4018
+ const elapsed = currentTime - startTime, progress = this._startValue === this._endValue ? 1 : Math.min(duration > 0 ? elapsed / duration : 0, 1), easedProgress = easingFunction(progress), val = (withDelta ? startPosDelta : 0) + this._startValue + this._diff * easedProgress, currentValue = val, t = performance.now();
4004
4019
  isFinished = progress === 1;
4005
- delta = currentValue - startDelta - prevPos;
4020
+ delta = currentValue - startDelta - this._prevPos;
4006
4021
  const frameTimestamp = t - prevTime, actualFrameTimestamp = frameTimestamp < ANIMATOR_MIN_TIMESTAMP ? ANIMATOR_MIN_TIMESTAMP : frameTimestamp;
4007
4022
  prevTime = t;
4008
- prevPos = currentValue;
4023
+ this._prevPos = currentValue;
4024
+ if (isFinished) {
4025
+ this._animationId = -1;
4026
+ }
4009
4027
  if (onUpdate !== undefined) {
4010
4028
  const data = {
4011
4029
  id,
4012
4030
  delta,
4013
4031
  elapsed,
4014
- value: !withDelta && isFinished ? endValue : currentValue,
4032
+ value: currentValue,
4015
4033
  timestamp: actualFrameTimestamp,
4016
4034
  };
4017
4035
  onUpdate(data);
4018
4036
  }
4019
4037
  if (isFinished) {
4020
- this._animationId = -1;
4021
4038
  if (onComplete !== undefined) {
4022
4039
  const data = {
4023
4040
  id,
4024
4041
  delta,
4025
4042
  elapsed,
4026
- value: withDelta ? currentValue : endValue,
4043
+ value: currentValue,
4027
4044
  timestamp: actualFrameTimestamp,
4028
4045
  };
4029
4046
  onComplete(data);
@@ -4054,7 +4071,7 @@ class Animator {
4054
4071
  const SCROLL_VIEW_INVERSION = new InjectionToken('ScrollViewInversion');
4055
4072
  const SCROLL_VIEW_OVERSCROLL_ENABLED = new InjectionToken('ScrollViewOverscrollEnabled');
4056
4073
  const SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO = new InjectionToken('ScrollViewNormalizeValueFromZero');
4057
- const TOP$1 = 'top', LEFT$1 = 'left', INSTANT$1 = 'instant', AUTO = 'auto', SMOOTH = 'smooth', DURATION = 2000, FRICTION_FORCE = .035, MAX_DURATION = 4000, ANIMATION_DURATION = 50, MASS = .005, ACCELERATION_SCALE = 40, MAX_DIST = 12500, MAX_VELOCITY_TIMESTAMP = 100, SPEED_SCALE = 15, OVERSCROLL_START_ITERATION = 2;
4074
+ const TOP$1 = 'top', LEFT$2 = 'left', INSTANT$1 = 'instant', AUTO = 'auto', SMOOTH = 'smooth', DURATION = 2000, FRICTION_FORCE = .035, MAX_DURATION = 4000, ANIMATION_DURATION = 50, MASS = .005, ACCELERATION_SCALE = 40, MAX_DIST = 12500, MAX_VELOCITY_TIMESTAMP = 100, SPEED_SCALE = 15, OVERSCROLL_START_ITERATION = 2;
4058
4075
  const MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS = 5, INSTANT_VELOCITY_SCALE = 1000;
4059
4076
  const SCROLL_EVENT$1 = new Event(SCROLLER_SCROLL);
4060
4077
 
@@ -4219,6 +4236,17 @@ class BaseScrollView extends DisposableComponent {
4219
4236
  $isVertical = this._$isVertical.asObservable();
4220
4237
  _$grabbing = new BehaviorSubject(false);
4221
4238
  $grabbing = this._$grabbing.asObservable();
4239
+ get grabbing() {
4240
+ return this._$grabbing.getValue();
4241
+ }
4242
+ _$langTextDir = new BehaviorSubject(DEFAULT_LANG_TEXT_DIR);
4243
+ $langTextDir = this._$langTextDir.asObservable();
4244
+ set langTextDir(v) {
4245
+ if (this._$langTextDir.getValue() !== v) {
4246
+ this._$langTextDir.next(v);
4247
+ }
4248
+ }
4249
+ get langTextDir() { return this._$langTextDir.getValue(); }
4222
4250
  _inversion = inject(SCROLL_VIEW_INVERSION);
4223
4251
  _overscrollEnabled = inject(SCROLL_VIEW_OVERSCROLL_ENABLED);
4224
4252
  _$updateScrollBar = new Subject();
@@ -4384,7 +4412,7 @@ class BaseScrollView extends DisposableComponent {
4384
4412
  }
4385
4413
  }
4386
4414
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseScrollView, deps: [], target: i0.ɵɵFactoryTarget.Component });
4387
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: BaseScrollView, selector: "base-scroll-view", inputs: { direction: "direction", startOffset: "startOffset", endOffset: "endOffset", alignmentStartOffset: "alignmentStartOffset", alignmentEndOffset: "alignmentEndOffset", isInfinity: "isInfinity" }, viewQueries: [{ propertyName: "scrollContent", first: true, predicate: ["scrollContent"], descendants: true }, { propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
4415
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: BaseScrollView, selector: "base-scroll-view", inputs: { direction: "direction", startOffset: "startOffset", endOffset: "endOffset", alignmentStartOffset: "alignmentStartOffset", alignmentEndOffset: "alignmentEndOffset", isInfinity: "isInfinity", langTextDir: "langTextDir" }, viewQueries: [{ propertyName: "scrollContent", first: true, predicate: ["scrollContent"], descendants: true }, { propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
4388
4416
  }
4389
4417
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseScrollView, decorators: [{
4390
4418
  type: Component,
@@ -4410,6 +4438,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4410
4438
  type: Input
4411
4439
  }], isInfinity: [{
4412
4440
  type: Input
4441
+ }], langTextDir: [{
4442
+ type: Input
4413
4443
  }] } });
4414
4444
 
4415
4445
  /**
@@ -4579,6 +4609,10 @@ class NgScrollView extends BaseScrollView {
4579
4609
  _measureVelocityLastPosition = this._$isVertical.getValue() ? this._y : this._x;
4580
4610
  _startPosition = 0;
4581
4611
  _animator = new Animator();
4612
+ _$horizontalAxisInvertion = new BehaviorSubject(false);
4613
+ $horizontalAxisInvertion = this._$horizontalAxisInvertion.asObservable();
4614
+ get horizontalAxisInvertion() { return this._$horizontalAxisInvertion.getValue(); }
4615
+ get inverted() { return this._$horizontalAxisInvertion.getValue(); }
4582
4616
  _interactive = true;
4583
4617
  _overscrollIteration = 0;
4584
4618
  set x(v) {
@@ -4637,6 +4671,9 @@ class NgScrollView extends BaseScrollView {
4637
4671
  }
4638
4672
  ngAfterViewInit() {
4639
4673
  let mouseCanceled = false, touchCanceled = false;
4674
+ combineLatest([this.$isVertical, this.$langTextDir]).pipe(takeUntil(this._$unsubscribe), tap(([isVertical, langTextDir]) => {
4675
+ this._$horizontalAxisInvertion.next(!isVertical && langTextDir === TextDirections.RTL);
4676
+ })).subscribe();
4640
4677
  const $viewportBounds = this.$viewportBounds;
4641
4678
  $viewportBounds.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(() => {
4642
4679
  this._isMoving = false;
@@ -4652,7 +4689,10 @@ class NgScrollView extends BaseScrollView {
4652
4689
  this._$scrollEnd.next(false);
4653
4690
  })).subscribe();
4654
4691
  const $wheel = this.$wheel;
4655
- $wheel.pipe(takeUntil(this._$unsubscribe), switchMap$1(v => of(this.averageVelocity)), debounceTime(100), tap(v => {
4692
+ $wheel.pipe(takeUntil(this._$unsubscribe), tap(() => {
4693
+ this._$grabbing.next(true);
4694
+ }), switchMap$1(v => of(this.averageVelocity)), debounceTime(100), tap(v => {
4695
+ this._$grabbing.next(false);
4656
4696
  this.snapWithInitialForceIfNecessary(v);
4657
4697
  this._scrollDirection.clear();
4658
4698
  })).subscribe();
@@ -4663,8 +4703,8 @@ class NgScrollView extends BaseScrollView {
4663
4703
  this.emitScrollableEvent();
4664
4704
  this.checkOverscroll(e);
4665
4705
  this.stopScrolling(true);
4666
- const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this._y : this._x, delta = isVertical ? e.deltaY : e.deltaX, dp = (startPos + delta), position = this.isInfinity ? dp : (dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp);
4667
- this.scroll({ [isVertical ? TOP$1 : LEFT$1]: position, behavior: INSTANT$1, userAction: true, blending: false, fireUpdate: true });
4706
+ const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this._y : this._x, delta = isVertical ? e.deltaY : (e.deltaX * (this.horizontalAxisInvertion ? -1 : 1)), dp = (startPos + delta), position = this.isInfinity ? dp : (dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp);
4707
+ this.scroll({ [isVertical ? TOP$1 : LEFT$2]: position, behavior: INSTANT$1, userAction: true, blending: false, fireUpdate: true });
4668
4708
  this._$wheel.next(delta);
4669
4709
  }));
4670
4710
  })).subscribe();
@@ -4717,7 +4757,7 @@ class NgScrollView extends BaseScrollView {
4717
4757
  this._isMoving = true;
4718
4758
  this._$grabbing.next(true);
4719
4759
  this._startPosition = (isVertical ? this.y : this.x);
4720
- let prevClientPosition = isVertical ? e.clientY : e.clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
4760
+ let prevClientPosition = (isVertical ? e.clientY : e.clientX) * (this.horizontalAxisInvertion ? -1 : 1), startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
4721
4761
  return fromEvent(window, MOUSE_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
4722
4762
  this.checkOverscroll(e);
4723
4763
  }), switchMap$1(e => {
@@ -4795,7 +4835,7 @@ class NgScrollView extends BaseScrollView {
4795
4835
  this._isMoving = true;
4796
4836
  this._$grabbing.next(true);
4797
4837
  this._startPosition = (isVertical ? this.y : this.x);
4798
- let prevClientPosition = isVertical ? e.touches[e.touches.length - 1].clientY : e.touches[e.touches.length - 1].clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
4838
+ let prevClientPosition = (isVertical ? e.touches[e.touches.length - 1].clientY : e.touches[e.touches.length - 1].clientX) * (this.horizontalAxisInvertion ? -1 : 1), startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
4799
4839
  return fromEvent(window, TOUCH_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
4800
4840
  this.checkOverscroll(e);
4801
4841
  }), switchMap$1(e => {
@@ -4893,7 +4933,7 @@ class NgScrollView extends BaseScrollView {
4893
4933
  return false;
4894
4934
  }
4895
4935
  calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities) {
4896
- const currentPos = isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX, scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position = this.isInfinity ? dp : dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp, endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = prevClientPosition === 0 ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
4936
+ const currentPos = (isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX) * (this.horizontalAxisInvertion ? -1 : 1), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position = this.isInfinity ? dp : dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp, endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = prevClientPosition === 0 ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
4897
4937
  this.calculateAcceleration(velocities, v0, timestamp);
4898
4938
  return { position, currentPos, endTime, scrollDelta };
4899
4939
  }
@@ -4983,7 +5023,7 @@ class NgScrollView extends BaseScrollView {
4983
5023
  this._animator.stop();
4984
5024
  }
4985
5025
  move(isVertical, position, blending = false, userAction = false, fireUpdate = true) {
4986
- this.scroll({ [isVertical ? TOP$1 : LEFT$1]: position, behavior: INSTANT$1, blending, userAction, fireUpdate });
5026
+ this.scroll({ [isVertical ? TOP$1 : LEFT$2]: position, behavior: INSTANT$1, blending, userAction, fireUpdate });
4987
5027
  }
4988
5028
  moveWithAcceleration(isVertical, position, v0, v, a0, timestamp) {
4989
5029
  if (a0 !== 0 && timestamp < MAX_VELOCITY_TIMESTAMP) {
@@ -5279,7 +5319,7 @@ class NgScrollView extends BaseScrollView {
5279
5319
  }
5280
5320
  refreshCoordinate(x, y) {
5281
5321
  const scrollContent = this.scrollContent?.nativeElement;
5282
- scrollContent.style.transform = matrix3d((this._inversion ? 1 : -1) * x + (this._$isVertical.getValue() ? 0 : this._startLayoutOffset), (this._inversion ? 1 : -1) * y + (this._$isVertical.getValue() ? this._startLayoutOffset : 0));
5322
+ scrollContent.style.transform = matrix3d((this._inversion ? 1 : -1) * x * (this.horizontalAxisInvertion ? -1 : 1) + (this._$isVertical.getValue() ? 0 : this._startLayoutOffset), (this._inversion ? 1 : -1) * y + (this._$isVertical.getValue() ? this._startLayoutOffset : 0));
5283
5323
  }
5284
5324
  fireScrollEvent(userAction) {
5285
5325
  this._$scroll.next(userAction);
@@ -5388,7 +5428,7 @@ class NgScrollBarComponent extends NgScrollView {
5388
5428
  this._$scrollbarMinSize.next(v);
5389
5429
  }
5390
5430
  }
5391
- get scrollbarMinSize() { return this._$endOffset.getValue(); }
5431
+ get scrollbarMinSize() { return this._$scrollbarMinSize.getValue(); }
5392
5432
  _$prepared = new BehaviorSubject(false);
5393
5433
  $prepared = this._$prepared.asObservable();
5394
5434
  set prepared(v) {
@@ -5397,14 +5437,6 @@ class NgScrollBarComponent extends NgScrollView {
5397
5437
  }
5398
5438
  }
5399
5439
  get prepared() { return this._$prepared.getValue(); }
5400
- _$langTextDir = new BehaviorSubject(DEFAULT_LANG_TEXT_DIR);
5401
- $langTextDir = this._$langTextDir.asObservable();
5402
- set langTextDir(v) {
5403
- if (this._$langTextDir.getValue() !== v) {
5404
- this._$langTextDir.next(v);
5405
- }
5406
- }
5407
- get langTextDir() { return this._$langTextDir.getValue(); }
5408
5440
  _$interactive = new BehaviorSubject(DEFAULT_SCROLLBAR_INTERACTIVE);
5409
5441
  $interactive = this._$interactive.asObservable();
5410
5442
  set interactive(v) {
@@ -5547,7 +5579,7 @@ class NgScrollBarComponent extends NgScrollView {
5547
5579
  const el = this._elementRef.nativeElement;
5548
5580
  if (!!el) {
5549
5581
  el.style[POSITION$1] = overlapping ? POSITION_ABSOLUTE : POSITION_RELATIVE;
5550
- el.style[LEFT$2] = overlapping && langTextDir === TextDirections.RTL ? '0' : UNSET$5;
5582
+ el.style[LEFT$3] = overlapping && langTextDir === TextDirections.RTL ? '0' : UNSET$5;
5551
5583
  el.style[RIGHT$1] = overlapping && langTextDir === TextDirections.LTR ? '0' : UNSET$5;
5552
5584
  el.style[WIDTH] = overlapping ? SIZE_AUTO : SIZE_100_PERSENT;
5553
5585
  }
@@ -5571,7 +5603,7 @@ class NgScrollBarComponent extends NgScrollView {
5571
5603
  })).subscribe();
5572
5604
  }
5573
5605
  createDragEvent(userAction) {
5574
- const isVertical = this._$isVertical.getValue(), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, scrollPosition = isVertical ? this.scrollTop : this.scrollLeft, startOffset = this.startOffset, endOffset = this.endOffset, scrollContent = this.scrollContent?.nativeElement, scrollViewport = this.scrollViewport?.nativeElement;
5606
+ const isVertical = this._$isVertical.getValue(), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, scrollPosition = isVertical ? this.y : this.x, startOffset = this.startOffset, endOffset = this.endOffset, scrollContent = this.scrollContent?.nativeElement, scrollViewport = this.scrollViewport?.nativeElement;
5575
5607
  if (!!scrollViewport && !!scrollContent) {
5576
5608
  const contentSize = isVertical ? scrollContent.offsetHeight : scrollContent.offsetWidth, viewportSize = isVertical ? scrollViewport.offsetHeight : scrollViewport.offsetWidth, offsetSize = (scrollSize !== 0 ? (startOffset / scrollSize) : 0), positionSize = (scrollSize !== 0 ? (scrollPosition / scrollSize) : 0), maxSize = 1 - offsetSize, pos = (positionSize - offsetSize);
5577
5609
  const event = {
@@ -5599,7 +5631,7 @@ class NgScrollBarComponent extends NgScrollView {
5599
5631
  this._scrollBarService.click(event);
5600
5632
  }
5601
5633
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgScrollBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5602
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgScrollBarComponent, selector: "ng-scroll-bar", inputs: { loading: "loading", thumbGradientPositions: "thumbGradientPositions", size: "size", thickness: "thickness", scrollbarMinSize: "scrollbarMinSize", prepared: "prepared", langTextDir: "langTextDir", interactive: "interactive", overlapping: "overlapping", show: "show", params: "params", renderer: "renderer" }, outputs: { onDrag: "onDrag", onDragEnd: "onDragEnd" }, providers: [
5634
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgScrollBarComponent, selector: "ng-scroll-bar", inputs: { loading: "loading", thumbGradientPositions: "thumbGradientPositions", size: "size", thickness: "thickness", scrollbarMinSize: "scrollbarMinSize", prepared: "prepared", interactive: "interactive", overlapping: "overlapping", show: "show", params: "params", renderer: "renderer" }, outputs: { onDrag: "onDrag", onDragEnd: "onDragEnd" }, providers: [
5603
5635
  { provide: SCROLL_VIEW_INVERSION, useValue: true },
5604
5636
  { provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: false },
5605
5637
  { provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: false },
@@ -5635,8 +5667,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5635
5667
  type: Input
5636
5668
  }], prepared: [{
5637
5669
  type: Input
5638
- }], langTextDir: [{
5639
- type: Input
5640
5670
  }], interactive: [{
5641
5671
  type: Input
5642
5672
  }], overlapping: [{
@@ -5649,7 +5679,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5649
5679
  type: Input
5650
5680
  }] } });
5651
5681
 
5652
- const RIGHT = 'right', DIR = 'dir';
5682
+ const LEFT$1 = 'left', RIGHT = 'right', DIR = 'dir';
5653
5683
  /**
5654
5684
  * LocaleSensitiveDirective
5655
5685
  * Maximum performance for extremely large lists.
@@ -5677,14 +5707,15 @@ class LocaleSensitiveDirective {
5677
5707
  this._elementRef = _elementRef;
5678
5708
  const $langTextDir = this.$langTextDir, $listDir = this.$listDir;
5679
5709
  combineLatest([$langTextDir, $listDir]).pipe(takeUntil(this._$unsubscribe), tap(([dir, listDir]) => {
5680
- const element = this._elementRef.nativeElement, isVertical = isDirection(listDir, ScrollerDirection$1.VERTICAL);
5681
- element.setAttribute(DIR, isVertical ? dir : TextDirections.LTR);
5682
- if (dir === TextDirections.RTL && isVertical) {
5710
+ const element = this._elementRef.nativeElement;
5711
+ element.setAttribute(DIR, dir);
5712
+ if (dir === TextDirections.RTL) {
5683
5713
  element.style.textAlign = RIGHT;
5684
5714
  element.classList.add(TextDirections.RTL);
5685
5715
  element.classList.remove(TextDirections.LTR);
5686
5716
  }
5687
5717
  else {
5718
+ element.style.textAlign = LEFT$1;
5688
5719
  element.classList.add(TextDirections.LTR);
5689
5720
  element.classList.remove(TextDirections.RTL);
5690
5721
  }
@@ -5855,8 +5886,6 @@ class NgScrollerComponent extends NgScrollView {
5855
5886
  $show = this._$show.asObservable();
5856
5887
  _$preparedSignal = new BehaviorSubject(false);
5857
5888
  $preparedSignal = this._$preparedSignal.asObservable();
5858
- _$langTextDir = new BehaviorSubject(TextDirections.LTR);
5859
- $langTextDir = this._$langTextDir.asObservable();
5860
5889
  _$listStyles = new BehaviorSubject({ perspectiveOrigin: 'center' });
5861
5890
  $listStyles = this._$listStyles.asObservable();
5862
5891
  _scrollBox = new ScrollBox$1();
@@ -5944,9 +5973,6 @@ class NgScrollerComponent extends NgScrollView {
5944
5973
  }), debounceTime(50), tap(([, , filter, ,]) => {
5945
5974
  filter.nativeElement.setStdDeviation(0, 0);
5946
5975
  })).subscribe();
5947
- this._service.$langTextDir.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(v => {
5948
- this._$langTextDir.next(v);
5949
- })).subscribe();
5950
5976
  const $prepare = this.$preparedSignal;
5951
5977
  $prepare.pipe(takeUntil(this._$unsubscribe), filter$1(v => !!v), tap(() => {
5952
5978
  this.updateScrollBarHandler(true, false, true);
@@ -5986,9 +6012,9 @@ class NgScrollerComponent extends NgScrollView {
5986
6012
  this._$viewInitialized.next(true);
5987
6013
  }
5988
6014
  recalculatePerspective() {
5989
- const isVertical = this._$isVertical.getValue(), scrollSize = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, { width, height } = this._$viewportBounds.getValue();
6015
+ const isVertical = this._$isVertical.getValue(), inverted = this.horizontalAxisInvertion, scrollSize = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, maxScrollSize = isVertical ? this.scrollHeight : this.scrollWidth, { width, height } = this._$viewportBounds.getValue();
5990
6016
  this._$listStyles.next({
5991
- perspectiveOrigin: `${isVertical ? width * .5 : (scrollSize + width * .5)}${PX$1} ${isVertical ? (scrollSize + height * .5) : height * .5}${PX$1}`
6017
+ perspectiveOrigin: `${isVertical ? width * .5 : (inverted ? ((maxScrollSize - scrollSize) + width * .5 - this.startOffset) : (scrollSize + width * .5))}${PX$1} ${isVertical ? (inverted ? ((maxScrollSize - scrollSize) + height * .5) : (scrollSize + height * .5)) : height * .5}${PX$1}`
5992
6018
  });
5993
6019
  }
5994
6020
  onResizeViewport() {
@@ -6001,6 +6027,7 @@ class NgScrollerComponent extends NgScrollView {
6001
6027
  this._$viewportBounds.next(bounds);
6002
6028
  this.updateScrollBar();
6003
6029
  this._$resizeViewport.next(bounds);
6030
+ this.recalculatePerspective();
6004
6031
  }
6005
6032
  }
6006
6033
  onResizeContent(value = null) {
@@ -6016,6 +6043,7 @@ class NgScrollerComponent extends NgScrollView {
6016
6043
  this._$contentBounds.next(bounds);
6017
6044
  this.updateScrollBar();
6018
6045
  this._$resizeContent.next(bounds);
6046
+ this.recalculatePerspective();
6019
6047
  }
6020
6048
  }
6021
6049
  updateScrollBarHandler(update = false, blending = true, fireUpdate = false) {
@@ -6180,7 +6208,7 @@ class NgScrollerComponent extends NgScrollView {
6180
6208
  { provide: SCROLL_VIEW_INVERSION, useValue: false },
6181
6209
  { provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: true },
6182
6210
  { provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: true },
6183
- ], viewQueries: [{ propertyName: "scrollBar", first: true, predicate: ["scrollBar"], descendants: true, read: NgScrollBarComponent }, { propertyName: "filter", first: true, predicate: ["filter"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div localeSensitive [langTextDir]=\"($langTextDir | async)!\" [listDir]=\"($direction | async)!\" class=\"ngvl__container\"\r\n [ngClass]=\"($containerClasses | async)!\">\r\n <svg part=\"viewport\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <filter [id]=\"_filterId\">\r\n <feGaussianBlur #filter></feGaussianBlur>\r\n </filter>\r\n <foreignObject xmlns=\"http://www.w3.org/1999/xhtml\" width=\"100%\" height=\"100%\" class=\"ngvl__viewport\">\r\n <div class=\"ngvl__scroller-wrapper\" [class.filtered]=\"($motionBlurEnabled | async)!\" [style.filter]=\"($motionBlurEnabled | async)! ? _filter : 'unset'\">\r\n <div cdkScrollable #scrollViewport part=\"scroller\" class=\"ngvl__scroller\">\r\n <div #scrollContent [attr.aria-orientation]=\"($direction | async)!\"\r\n [attr.aria-activedescendant]=\"$focusedElement | async\" tabindex=\"0\" part=\"list\" class=\"ngvl__list\"\r\n [ngClass]=\"($actualClasses | async)!\" [ngStyle]=\"($listStyles | async)!\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n <ng-container *ngIf=\"($scrollbarEnabled | async)!\">\r\n <ng-scroll-bar #scrollBar [direction]=\"($direction | async)!\" [size]=\"($actualThumbSize | async)!\" [renderer]=\"($scrollbarThumbRenderer | async)!\"\r\n [thickness]=\"($scrollbarThickness | async)!\" [params]=\"($scrollbarThumbParams | async)!\" [loading]=\"($loading | async)!\" [overlapping]=\"($overlappingScrollbar | async)!\"\r\n [thumbGradientPositions]=\"($thumbColorPositions | async)!\" [prepared]=\"($preparedSignal | async)!\" [interactive]=\"($scrollbarInteractive | async)!\"\r\n [show]=\"($show | async)!\" [startOffset]=\"($startOffset | async)!\" [langTextDir]=\"($langTextDir | async)!\"\r\n [endOffset]=\"($endOffset | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" (onDrag)=\"onScrollBarDragHandler($event)\"\r\n (onDragEnd)=\"onScrollBarDragEndHandler($event)\"></ng-scroll-bar>\r\n </ng-container>\r\n</div>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none}.ngvl__container{position:relative;overflow:hidden;display:grid;width:100%;height:100%;cursor:grab}.ngvl__container.overlapping{position:relative;display:block}.ngvl__container.grabbing{cursor:grabbing}.ngvl__container.horizontal{transition:grid-template-rows .1s ease-out}.ngvl__container.horizontal:not(.overlapping){grid-template-rows:1fr 0}.ngvl__container.horizontal.scrollable.enabled:not(.overlapping){grid-template-rows:1fr auto}.ngvl__container.horizontal .ngvl__list{display:inline-flex}.ngvl__container.horizontal .ngvl__scroller-wrapper.filtered,.ngvl__container.horizontal .ngvl__scroller{overflow:unset}.ngvl__container.vertical{transition:grid-template-columns .1s ease-out}.ngvl__container.vertical:not(.overlapping){grid-template-columns:1fr 0}.ngvl__container.vertical.scrollable.enabled:not(.overlapping){grid-template-columns:1fr auto}.ngvl__container.vertical .ngvl__scroller-wrapper.filtered,.ngvl__container.vertical .ngvl__scroller{overflow:unset}.ngvl__container .ngvl__scroller-wrapper,.ngvl__container .ngvl__scroller{display:block;position:relative;overflow:hidden;width:100%;height:100%}.ngvl__container .ngvl__list{position:absolute;list-style:none;padding:0;margin:0;width:100%;height:100%;opacity:0}.ngvl__container .ngvl__list.prepared{opacity:1}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgScrollBarComponent, selector: "ng-scroll-bar", inputs: ["loading", "thumbGradientPositions", "size", "thickness", "scrollbarMinSize", "prepared", "langTextDir", "interactive", "overlapping", "show", "params", "renderer"], outputs: ["onDrag", "onDragEnd"] }, { kind: "directive", type: LocaleSensitiveDirective, selector: "[localeSensitive]", inputs: ["langTextDir", "listDir"] }, { kind: "directive", type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
6211
+ ], viewQueries: [{ propertyName: "scrollBar", first: true, predicate: ["scrollBar"], descendants: true, read: NgScrollBarComponent }, { propertyName: "filter", first: true, predicate: ["filter"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div localeSensitive [langTextDir]=\"($langTextDir | async)!\" [listDir]=\"($direction | async)!\" class=\"ngvl__container\"\r\n [ngClass]=\"($containerClasses | async)!\">\r\n <svg part=\"viewport\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <filter [id]=\"_filterId\">\r\n <feGaussianBlur #filter></feGaussianBlur>\r\n </filter>\r\n <foreignObject xmlns=\"http://www.w3.org/1999/xhtml\" width=\"100%\" height=\"100%\" class=\"ngvl__viewport\">\r\n <div class=\"ngvl__scroller-wrapper\" [class.filtered]=\"($motionBlurEnabled | async)!\"\r\n [style.filter]=\"($motionBlurEnabled | async)! ? _filter : 'unset'\">\r\n <div cdkScrollable #scrollViewport part=\"scroller\" class=\"ngvl__scroller\">\r\n <div #scrollContent [attr.aria-orientation]=\"($direction | async)!\"\r\n [attr.aria-activedescendant]=\"$focusedElement | async\" tabindex=\"0\" part=\"list\"\r\n class=\"ngvl__list\" [ngClass]=\"($actualClasses | async)!\" [ngStyle]=\"($listStyles | async)!\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n <ng-container *ngIf=\"($scrollbarEnabled | async)!\">\r\n <ng-scroll-bar #scrollBar [direction]=\"($direction | async)!\" [size]=\"($actualThumbSize | async)!\"\r\n [langTextDir]=\"($langTextDir | async)!\" [renderer]=\"($scrollbarThumbRenderer | async)!\"\r\n [thickness]=\"($scrollbarThickness | async)!\" [params]=\"($scrollbarThumbParams | async)!\"\r\n [loading]=\"($loading | async)!\" [overlapping]=\"($overlappingScrollbar | async)!\"\r\n [thumbGradientPositions]=\"($thumbColorPositions | async)!\" [prepared]=\"($preparedSignal | async)!\"\r\n [interactive]=\"($scrollbarInteractive | async)!\" [show]=\"($show | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [langTextDir]=\"($langTextDir | async)!\"\r\n [endOffset]=\"($endOffset | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [scrollBehavior]=\"($scrollBehavior | async)!\" [scrollbarMinSize]=\"($scrollbarMinSize | async)!\"\r\n (onDrag)=\"onScrollBarDragHandler($event)\" (onDragEnd)=\"onScrollBarDragEndHandler($event)\"></ng-scroll-bar>\r\n </ng-container>\r\n</div>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none}.ngvl__container{position:relative;overflow:hidden;display:grid;width:100%;height:100%;cursor:grab}.ngvl__container.overlapping{position:relative;display:block}.ngvl__container.grabbing{cursor:grabbing}.ngvl__container.horizontal{transition:grid-template-rows .1s ease-out}.ngvl__container.horizontal:not(.overlapping){grid-template-rows:1fr 0}.ngvl__container.horizontal.scrollable.enabled:not(.overlapping){grid-template-rows:1fr auto}.ngvl__container.horizontal .ngvl__list{display:inline-flex}.ngvl__container.horizontal .ngvl__scroller-wrapper.filtered,.ngvl__container.horizontal .ngvl__scroller{overflow:unset}.ngvl__container.vertical{transition:grid-template-columns .1s ease-out}.ngvl__container.vertical:not(.overlapping){grid-template-columns:1fr 0}.ngvl__container.vertical.scrollable.enabled:not(.overlapping){grid-template-columns:1fr auto}.ngvl__container.vertical .ngvl__scroller-wrapper.filtered,.ngvl__container.vertical .ngvl__scroller{overflow:unset}.ngvl__container .ngvl__scroller-wrapper,.ngvl__container .ngvl__scroller{display:block;position:relative;overflow:hidden;width:100%;height:100%}.ngvl__container .ngvl__list{position:absolute;list-style:none;padding:0;margin:0;width:100%;height:100%;opacity:0}.ngvl__container .ngvl__list.prepared{opacity:1}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgScrollBarComponent, selector: "ng-scroll-bar", inputs: ["loading", "thumbGradientPositions", "size", "thickness", "scrollbarMinSize", "prepared", "interactive", "overlapping", "show", "params", "renderer"], outputs: ["onDrag", "onDragEnd"] }, { kind: "directive", type: LocaleSensitiveDirective, selector: "[localeSensitive]", inputs: ["langTextDir", "listDir"] }, { kind: "directive", type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
6184
6212
  }
6185
6213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgScrollerComponent, decorators: [{
6186
6214
  type: Component,
@@ -6188,7 +6216,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
6188
6216
  { provide: SCROLL_VIEW_INVERSION, useValue: false },
6189
6217
  { provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: true },
6190
6218
  { provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: true },
6191
- ], standalone: false, template: "<div localeSensitive [langTextDir]=\"($langTextDir | async)!\" [listDir]=\"($direction | async)!\" class=\"ngvl__container\"\r\n [ngClass]=\"($containerClasses | async)!\">\r\n <svg part=\"viewport\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <filter [id]=\"_filterId\">\r\n <feGaussianBlur #filter></feGaussianBlur>\r\n </filter>\r\n <foreignObject xmlns=\"http://www.w3.org/1999/xhtml\" width=\"100%\" height=\"100%\" class=\"ngvl__viewport\">\r\n <div class=\"ngvl__scroller-wrapper\" [class.filtered]=\"($motionBlurEnabled | async)!\" [style.filter]=\"($motionBlurEnabled | async)! ? _filter : 'unset'\">\r\n <div cdkScrollable #scrollViewport part=\"scroller\" class=\"ngvl__scroller\">\r\n <div #scrollContent [attr.aria-orientation]=\"($direction | async)!\"\r\n [attr.aria-activedescendant]=\"$focusedElement | async\" tabindex=\"0\" part=\"list\" class=\"ngvl__list\"\r\n [ngClass]=\"($actualClasses | async)!\" [ngStyle]=\"($listStyles | async)!\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n <ng-container *ngIf=\"($scrollbarEnabled | async)!\">\r\n <ng-scroll-bar #scrollBar [direction]=\"($direction | async)!\" [size]=\"($actualThumbSize | async)!\" [renderer]=\"($scrollbarThumbRenderer | async)!\"\r\n [thickness]=\"($scrollbarThickness | async)!\" [params]=\"($scrollbarThumbParams | async)!\" [loading]=\"($loading | async)!\" [overlapping]=\"($overlappingScrollbar | async)!\"\r\n [thumbGradientPositions]=\"($thumbColorPositions | async)!\" [prepared]=\"($preparedSignal | async)!\" [interactive]=\"($scrollbarInteractive | async)!\"\r\n [show]=\"($show | async)!\" [startOffset]=\"($startOffset | async)!\" [langTextDir]=\"($langTextDir | async)!\"\r\n [endOffset]=\"($endOffset | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" (onDrag)=\"onScrollBarDragHandler($event)\"\r\n (onDragEnd)=\"onScrollBarDragEndHandler($event)\"></ng-scroll-bar>\r\n </ng-container>\r\n</div>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none}.ngvl__container{position:relative;overflow:hidden;display:grid;width:100%;height:100%;cursor:grab}.ngvl__container.overlapping{position:relative;display:block}.ngvl__container.grabbing{cursor:grabbing}.ngvl__container.horizontal{transition:grid-template-rows .1s ease-out}.ngvl__container.horizontal:not(.overlapping){grid-template-rows:1fr 0}.ngvl__container.horizontal.scrollable.enabled:not(.overlapping){grid-template-rows:1fr auto}.ngvl__container.horizontal .ngvl__list{display:inline-flex}.ngvl__container.horizontal .ngvl__scroller-wrapper.filtered,.ngvl__container.horizontal .ngvl__scroller{overflow:unset}.ngvl__container.vertical{transition:grid-template-columns .1s ease-out}.ngvl__container.vertical:not(.overlapping){grid-template-columns:1fr 0}.ngvl__container.vertical.scrollable.enabled:not(.overlapping){grid-template-columns:1fr auto}.ngvl__container.vertical .ngvl__scroller-wrapper.filtered,.ngvl__container.vertical .ngvl__scroller{overflow:unset}.ngvl__container .ngvl__scroller-wrapper,.ngvl__container .ngvl__scroller{display:block;position:relative;overflow:hidden;width:100%;height:100%}.ngvl__container .ngvl__list{position:absolute;list-style:none;padding:0;margin:0;width:100%;height:100%;opacity:0}.ngvl__container .ngvl__list.prepared{opacity:1}\n"] }]
6219
+ ], standalone: false, template: "<div localeSensitive [langTextDir]=\"($langTextDir | async)!\" [listDir]=\"($direction | async)!\" class=\"ngvl__container\"\r\n [ngClass]=\"($containerClasses | async)!\">\r\n <svg part=\"viewport\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <filter [id]=\"_filterId\">\r\n <feGaussianBlur #filter></feGaussianBlur>\r\n </filter>\r\n <foreignObject xmlns=\"http://www.w3.org/1999/xhtml\" width=\"100%\" height=\"100%\" class=\"ngvl__viewport\">\r\n <div class=\"ngvl__scroller-wrapper\" [class.filtered]=\"($motionBlurEnabled | async)!\"\r\n [style.filter]=\"($motionBlurEnabled | async)! ? _filter : 'unset'\">\r\n <div cdkScrollable #scrollViewport part=\"scroller\" class=\"ngvl__scroller\">\r\n <div #scrollContent [attr.aria-orientation]=\"($direction | async)!\"\r\n [attr.aria-activedescendant]=\"$focusedElement | async\" tabindex=\"0\" part=\"list\"\r\n class=\"ngvl__list\" [ngClass]=\"($actualClasses | async)!\" [ngStyle]=\"($listStyles | async)!\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n <ng-container *ngIf=\"($scrollbarEnabled | async)!\">\r\n <ng-scroll-bar #scrollBar [direction]=\"($direction | async)!\" [size]=\"($actualThumbSize | async)!\"\r\n [langTextDir]=\"($langTextDir | async)!\" [renderer]=\"($scrollbarThumbRenderer | async)!\"\r\n [thickness]=\"($scrollbarThickness | async)!\" [params]=\"($scrollbarThumbParams | async)!\"\r\n [loading]=\"($loading | async)!\" [overlapping]=\"($overlappingScrollbar | async)!\"\r\n [thumbGradientPositions]=\"($thumbColorPositions | async)!\" [prepared]=\"($preparedSignal | async)!\"\r\n [interactive]=\"($scrollbarInteractive | async)!\" [show]=\"($show | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [langTextDir]=\"($langTextDir | async)!\"\r\n [endOffset]=\"($endOffset | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [scrollBehavior]=\"($scrollBehavior | async)!\" [scrollbarMinSize]=\"($scrollbarMinSize | async)!\"\r\n (onDrag)=\"onScrollBarDragHandler($event)\" (onDragEnd)=\"onScrollBarDragEndHandler($event)\"></ng-scroll-bar>\r\n </ng-container>\r\n</div>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none}.ngvl__container{position:relative;overflow:hidden;display:grid;width:100%;height:100%;cursor:grab}.ngvl__container.overlapping{position:relative;display:block}.ngvl__container.grabbing{cursor:grabbing}.ngvl__container.horizontal{transition:grid-template-rows .1s ease-out}.ngvl__container.horizontal:not(.overlapping){grid-template-rows:1fr 0}.ngvl__container.horizontal.scrollable.enabled:not(.overlapping){grid-template-rows:1fr auto}.ngvl__container.horizontal .ngvl__list{display:inline-flex}.ngvl__container.horizontal .ngvl__scroller-wrapper.filtered,.ngvl__container.horizontal .ngvl__scroller{overflow:unset}.ngvl__container.vertical{transition:grid-template-columns .1s ease-out}.ngvl__container.vertical:not(.overlapping){grid-template-columns:1fr 0}.ngvl__container.vertical.scrollable.enabled:not(.overlapping){grid-template-columns:1fr auto}.ngvl__container.vertical .ngvl__scroller-wrapper.filtered,.ngvl__container.vertical .ngvl__scroller{overflow:unset}.ngvl__container .ngvl__scroller-wrapper,.ngvl__container .ngvl__scroller{display:block;position:relative;overflow:hidden;width:100%;height:100%}.ngvl__container .ngvl__list{position:absolute;list-style:none;padding:0;margin:0;width:100%;height:100%;opacity:0}.ngvl__container .ngvl__list.prepared{opacity:1}\n"] }]
6192
6220
  }], ctorParameters: function () { return []; }, propDecorators: { scrollBar: [{
6193
6221
  type: ViewChild,
6194
6222
  args: ['scrollBar', { read: NgScrollBarComponent }]
@@ -6241,6 +6269,7 @@ const createItemData = (data, isVertical, bounds, boundsSize, dynamic, divides,
6241
6269
  measures: {
6242
6270
  position: 0,
6243
6271
  scrollSize: 0,
6272
+ maxScrollSize: 0,
6244
6273
  size: itemSize,
6245
6274
  row: {
6246
6275
  size: itemSize,
@@ -6300,6 +6329,7 @@ const createItemData = (data, isVertical, bounds, boundsSize, dynamic, divides,
6300
6329
  fullSize: false,
6301
6330
  layoutIndexOffset: 0,
6302
6331
  totalItems: 0,
6332
+ inverted: false,
6303
6333
  },
6304
6334
  };
6305
6335
  };
@@ -6524,8 +6554,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
6524
6554
  */
6525
6555
  class NgPrerenderScrollerComponent extends BaseScrollView {
6526
6556
  scrollBar;
6527
- _$langTextDir = new BehaviorSubject(TextDirections.LTR);
6528
- $langTextDir = this._$langTextDir.asObservable();
6529
6557
  _$scrollbarEnabled = new BehaviorSubject(DEFAULT_SCROLLBAR_ENABLED);
6530
6558
  $scrollbarEnabled = this._$scrollbarEnabled.asObservable();
6531
6559
  set scrollbarEnabled(v) {
@@ -7309,16 +7337,6 @@ class NgVirtualListComponent extends DisposableComponent {
7309
7337
  }
7310
7338
  ;
7311
7339
  get scrollbarThumbParams() { return this._$scrollbarThumbParams.getValue(); }
7312
- _loading = {
7313
- transform: (v) => {
7314
- const valid = validateBoolean(v);
7315
- if (!valid) {
7316
- console.error('The "loading" parameter must be of type `boolean`.');
7317
- return false;
7318
- }
7319
- return v;
7320
- },
7321
- };
7322
7340
  _$loading = new BehaviorSubject(false);
7323
7341
  $loading = this._$loading.asObservable();
7324
7342
  _loadingTransform = (v) => {
@@ -8072,9 +8090,9 @@ class NgVirtualListComponent extends DisposableComponent {
8072
8090
  const valid = validateFloat(v);
8073
8091
  if (!valid) {
8074
8092
  console.error('The "motionBlur" parameter must be of type `number`.');
8075
- return DEFAULT_DIVIDES;
8093
+ return DEFAULT_MOTION_BLUR;
8076
8094
  }
8077
- return v <= 0 ? DEFAULT_DIVIDES : v;
8095
+ return v <= 0 ? DEFAULT_MOTION_BLUR : v;
8078
8096
  };
8079
8097
  /**
8080
8098
  * Motion blur effect. The default value is `0.15`.
@@ -8740,19 +8758,22 @@ class NgVirtualListComponent extends DisposableComponent {
8740
8758
  }
8741
8759
  const scroller = this._scrollerComponent;
8742
8760
  if (!!scroller) {
8743
- const { width, height } = this._$bounds.getValue(), { width: elementWidth, height: elementHeight } = element.getBoundingClientRect(), isVertical = this._isVertical, viewportSize = isVertical ? height : width, elementSize = isVertical ? elementHeight : elementWidth;
8761
+ const { width, height } = this._$bounds.getValue(), { width: elementWidth, height: elementHeight } = element.getBoundingClientRect(), isVertical = this._isVertical, viewportSize = isVertical ? height : width, maxPosition = isVertical ? scroller.scrollHeight : scroller.scrollWidth, elementSize = isVertical ? elementHeight : elementWidth;
8744
8762
  let pos = Number.NaN;
8745
8763
  switch (align) {
8746
8764
  case FocusAlignments.START: {
8747
- pos = position + scroller.startLayoutOffset;
8765
+ const p = position + scroller.startLayoutOffset;
8766
+ pos = scroller.inverted ? (maxPosition - p) : p;
8748
8767
  break;
8749
8768
  }
8750
8769
  case FocusAlignments.CENTER: {
8751
- pos = position - (viewportSize - elementSize) * .5 + scroller.startLayoutOffset;
8770
+ const p = position - (viewportSize - elementSize) * .5 + scroller.startLayoutOffset;
8771
+ pos = scroller.inverted ? (maxPosition - p) : p;
8752
8772
  break;
8753
8773
  }
8754
8774
  case FocusAlignments.END: {
8755
- pos = position - (viewportSize - elementSize) + scroller.startLayoutOffset;
8775
+ const p = position - (viewportSize - elementSize) + scroller.startLayoutOffset;
8776
+ pos = scroller.inverted ? (maxPosition - p) : p;
8756
8777
  break;
8757
8778
  }
8758
8779
  case FocusAlignments.NONE:
@@ -8860,10 +8881,9 @@ class NgVirtualListComponent extends DisposableComponent {
8860
8881
  this.onSnapItem.emit(id);
8861
8882
  })).subscribe();
8862
8883
  this._service.$tick.pipe(takeUntil(this._$unsubscribe), tap(() => {
8863
- this._scrollerComponent?.tick();
8864
- })).subscribe();
8865
- this._service.$tick.pipe(takeUntil(this._$unsubscribe), filter$1(() => this.dynamicSize === true), tap(() => {
8866
- this.checkBoundsOfElements();
8884
+ if (this.dynamicSize === true) {
8885
+ this.checkBoundsOfElements();
8886
+ }
8867
8887
  this._scrollerComponent?.tick();
8868
8888
  })).subscribe();
8869
8889
  }
@@ -9236,7 +9256,12 @@ class NgVirtualListComponent extends DisposableComponent {
9236
9256
  combineLatest([this.$scrollbarEnabled, this.$isInfinity]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(([scrollbarEnabled, isInfinity]) => {
9237
9257
  this._$actualScrollbarEnabled.next(isInfinity ? false : scrollbarEnabled);
9238
9258
  })).subscribe();
9239
- const $alignment = this.$actualAlignment, $precalculatedScrollStartOffset = this._$precalculatedScrollStartOffset.asObservable(), $precalculatedScrollEndOffset = this._$precalculatedScrollEndOffset.asObservable(), $listBounds = this._$listBounds.asObservable().pipe(filter$1(b => !!b)), $scrollSize = this._$scrollSize.asObservable(), $bufferSize = this.$bufferSize.pipe(map(v => v < 0 ? DEFAULT_BUFFER_SIZE : v)), $maxBufferSize = this.$maxBufferSize.pipe(map(v => v < 0 ? DEFAULT_BUFFER_SIZE : v)), $snapToItem = this.$snapToItem, $snapToItemAlign = this.$snapToItemAlign, $stickyEnabled = this.$stickyEnabled, $isLazy = this.$collectionMode.pipe(map(v => this.getIsLazy(v || DEFAULT_COLLECTION_MODE))), $enabledBufferOptimization = this.$enabledBufferOptimization, $snappingMethod = this.$snappingMethod.pipe(map(v => this.getIsSnappingMethodAdvanced(v || DEFAULT_SNAPPING_METHOD))), $collapsingMode = this.$collapsingMode, $selectingMode = this.$selectingMode, $selectedIds = this.$selectedIds, $collapsedIds = this.$collapsedIds.pipe(distinctUntilChanged(), map(v => Array.isArray(v) ? v : [])), $collapsedItemIds = this._$collapsedItemIds.asObservable().pipe(distinctUntilChanged(), map(v => Array.isArray(v) ? v : [])), $itemTransform = this.$itemTransform, $screenReaderMessage = this.$screenReaderMessage, $displayItems = this._service.$displayItems, $cacheVersion = this._service.$cacheVersion;
9259
+ const $alignment = this.$actualAlignment, $precalculatedScrollStartOffset = this._$precalculatedScrollStartOffset.asObservable(), $precalculatedScrollEndOffset = this._$precalculatedScrollEndOffset.asObservable(), $listBounds = this._$listBounds.asObservable().pipe(filter$1(b => !!b)), $scrollSize = this._$scrollSize.asObservable(), $bufferSize = this.$bufferSize.pipe(map(v => v < 0 ? DEFAULT_BUFFER_SIZE : v)), $maxBufferSize = this.$maxBufferSize.pipe(map(v => v < 0 ? DEFAULT_BUFFER_SIZE : v)), $snapToItem = this.$snapToItem, $snapToItemAlign = this.$snapToItemAlign, $stickyEnabled = this.$stickyEnabled, $isLazy = this.$collectionMode.pipe(map(v => this.getIsLazy(v || DEFAULT_COLLECTION_MODE))), $enabledBufferOptimization = this.$enabledBufferOptimization, $snappingMethod = this.$snappingMethod.pipe(map(v => this.getIsSnappingMethodAdvanced(v || DEFAULT_SNAPPING_METHOD))), $collapsingMode = this.$collapsingMode, $selectingMode = this.$selectingMode, $selectedIds = this.$selectedIds, $collapsedIds = this.$collapsedIds.pipe(distinctUntilChanged(), map(v => Array.isArray(v) ? v : [])), $collapsedItemIds = this._$collapsedItemIds.asObservable().pipe(distinctUntilChanged(), map(v => Array.isArray(v) ? v : [])), $langTextDir = this.$langTextDir, $itemTransform = this.$itemTransform, $screenReaderMessage = this.$screenReaderMessage, $displayItems = this._service.$displayItems, $cacheVersion = this._service.$cacheVersion;
9260
+ combineLatest([$isVertical, $langTextDir, $itemTransform]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(([isVertical, langTextDir, itemTransform]) => {
9261
+ if (langTextDir === TextDirections.RTL && !isVertical && itemTransform) {
9262
+ throw Error('Currently, converting right-to-left items in horizontal lists is not possible.');
9263
+ }
9264
+ })).subscribe();
9240
9265
  $snapToItem.pipe(takeUntil(this._$unsubscribe), tap(v => {
9241
9266
  this._service.snapToItem = v;
9242
9267
  })).subscribe();
@@ -9297,6 +9322,9 @@ class NgVirtualListComponent extends DisposableComponent {
9297
9322
  actualItems.push(item);
9298
9323
  }
9299
9324
  const normalizedCollection = normalizeCollection(actualItems, itemConfigMap, trackBy, divides);
9325
+ if (this._scrollerComponent?.inverted) {
9326
+ normalizedCollection.reverse();
9327
+ }
9300
9328
  this._$actualItems.next(normalizedCollection);
9301
9329
  })).subscribe();
9302
9330
  $isVertical.pipe(takeUntil(this._$unsubscribe), tap(v => {
@@ -9418,20 +9446,21 @@ class NgVirtualListComponent extends DisposableComponent {
9418
9446
  if (!!scroller) {
9419
9447
  const isInfinity = this.isInfinity, collapsable = collapsedIds.length > 0, cachable = this.cachable, cached = this._cached, waitingCache = cachable && !cached, emitUpdate = !this._readyForShow || waitingCache || collapsable || isChunkLoading, fireUpdate = !this._readyForShow || this._$scrollingTo.getValue(), fireUpdateAtEdges = fireUpdate || !isInfinity, useAnimations = !isInfinity && readyForAnimations && prevScrollable;
9420
9448
  if (this._readyForShow || (cachable && cached)) {
9421
- const currentScrollSize = (isVertical ? scroller.scrollTop : scroller.scrollLeft);
9422
- let actualScrollSize = !this._readyForShow && snapScrollToEnd ? (isVertical ? scroller.scrollHeight : scroller.scrollWidth) :
9449
+ const inverted = scroller.inverted, currentScrollSize = (isVertical ? scroller.scrollTop : scroller.scrollLeft), maxScrollSize = (isVertical ? scroller.scrollHeight : scroller.scrollWidth);
9450
+ let actualScrollSize = !this._readyForShow && snapScrollToEnd ? maxScrollSize :
9423
9451
  (isVertical ? scroller.scrollTop : scroller.scrollLeft), leftLayoutOffset = 0, displayItems;
9424
- const { width, height } = bounds, viewportSize = (isVertical ? height : width), opts = {
9452
+ const { width, height } = bounds, opts = {
9425
9453
  alignment, bounds: { width, height }, dynamicSize, isVertical, itemSize, minItemSize, maxItemSize, bufferSize, maxBufferSize,
9426
- scrollSize: actualScrollSize, stickyEnabled, enabledBufferOptimization, snapToItem, snapToItemAlign, itemTransform,
9454
+ scrollSize: inverted ? maxScrollSize - actualScrollSize : actualScrollSize, stickyEnabled, enabledBufferOptimization,
9455
+ snapToItem, snapToItemAlign, inverted, itemTransform,
9427
9456
  };
9428
9457
  if (snapScrollToEnd && !this._readyForShow) {
9429
- const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize1, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: actualScrollSize });
9458
+ const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize1, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: inverted ? maxScrollSize - actualScrollSize : actualScrollSize });
9430
9459
  displayItems = calculatedDisplayItems;
9431
9460
  totalSize = calculatedTotalSize1;
9432
9461
  leftLayoutOffset = leftLayoutOffset1;
9433
9462
  if (!!itemTransform && dynamicSize && this._trackBox.delta !== 0) {
9434
- const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize1, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: actualScrollSize + this._trackBox.delta });
9463
+ const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize1, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: inverted ? (maxScrollSize - actualScrollSize + this._trackBox.delta) : (actualScrollSize + this._trackBox.delta) });
9435
9464
  displayItems = calculatedDisplayItems;
9436
9465
  totalSize = calculatedTotalSize1;
9437
9466
  leftLayoutOffset = leftLayoutOffset1;
@@ -9443,7 +9472,7 @@ class NgVirtualListComponent extends DisposableComponent {
9443
9472
  totalSize = calculatedTotalSize;
9444
9473
  leftLayoutOffset = leftLayoutOffset1;
9445
9474
  if (!!itemTransform && dynamicSize && this._trackBox.delta !== 0) {
9446
- const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: actualScrollSize + this._trackBox.delta });
9475
+ const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: inverted ? (maxScrollSize - actualScrollSize + this._trackBox.delta) : (actualScrollSize + this._trackBox.delta) });
9447
9476
  displayItems = calculatedDisplayItems;
9448
9477
  totalSize = calculatedTotalSize;
9449
9478
  leftLayoutOffset = leftLayoutOffset1;
@@ -9467,18 +9496,49 @@ class NgVirtualListComponent extends DisposableComponent {
9467
9496
  this.updateOffsetsByAllignment();
9468
9497
  scroller.delta = delta;
9469
9498
  prevScrollable = scroller.scrollable;
9470
- if ((snapScrollToStart && this._trackBox.isSnappedToStart && scroller.scrollable) ||
9471
- (snapScrollToStart && currentScrollSize <= MIN_PIXELS_FOR_PREVENT_SNAPPING)) {
9472
- if (currentScrollSize !== roundedScrollPositionAfterUpdate) {
9499
+ if (!scroller.grabbing) {
9500
+ if ((snapScrollToStart && this._trackBox.isSnappedToStart && scroller.scrollable) ||
9501
+ (snapScrollToStart && currentScrollSize <= MIN_PIXELS_FOR_PREVENT_SNAPPING)) {
9502
+ if (currentScrollSize !== roundedScrollPositionAfterUpdate) {
9503
+ this._trackBox.clearDelta();
9504
+ if (this._readyForShow) {
9505
+ this.emitScrollEvent(true, false, userAction);
9506
+ }
9507
+ this._trackBox.isScrollEnd;
9508
+ const params = {
9509
+ [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: 0, userAction,
9510
+ fireUpdate: fireUpdateAtEdges, behavior: !useAnimations ? BEHAVIOR_INSTANT : ((this.animationParams.scrollToItem > 0 && this.scrollBehavior !== BEHAVIOR_INSTANT) ? BEHAVIOR_AUTO : BEHAVIOR_INSTANT),
9511
+ blending: useAnimations && scroller.hasAnimation(this._animationId), duration: this.animationParams.scrollToItem,
9512
+ };
9513
+ const animationId = scroller?.scrollTo?.(params);
9514
+ if (animationId > -1) {
9515
+ this._animationId = animationId;
9516
+ }
9517
+ else {
9518
+ scroller.stopAnimation(this._animationId);
9519
+ }
9520
+ scroller?.scrollTo?.(params);
9521
+ if (emitUpdate) {
9522
+ this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
9523
+ }
9524
+ }
9525
+ return;
9526
+ }
9527
+ if ((snapScrollToEnd && this._trackBox.isSnappedToEnd) || (snapScrollToEnd && !scroller.scrollable) ||
9528
+ (scrollPositionAfterUpdate + MIN_PIXELS_FOR_PREVENT_SNAPPING >= roundedMaxPositionAfterUpdate) ||
9529
+ (roundedScrollPositionAfterUpdate >= scrollPositionAfterUpdate + MIN_PIXELS_FOR_PREVENT_SNAPPING)) {
9473
9530
  this._trackBox.clearDelta();
9531
+ if (!this._trackBox.isSnappedToEnd) {
9532
+ this._trackBox.isScrollEnd = true;
9533
+ this._trackBox.isScrollStart = false;
9534
+ }
9474
9535
  if (this._readyForShow) {
9475
- this.emitScrollEvent(true, false, userAction);
9536
+ this.emitScrollEvent(true, false, false);
9476
9537
  }
9477
- this._trackBox.isScrollEnd;
9478
9538
  const params = {
9479
- [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: 0, userAction,
9480
- fireUpdate: fireUpdateAtEdges, behavior: !useAnimations ? BEHAVIOR_INSTANT : ((this.animationParams.scrollToItem > 0 && this.scrollBehavior !== BEHAVIOR_INSTANT) ? BEHAVIOR_AUTO : BEHAVIOR_INSTANT),
9481
- blending: useAnimations && scroller.hasAnimation(this._animationId), duration: this.animationParams.scrollToItem,
9539
+ [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: roundedMaxPositionAfterUpdate,
9540
+ fireUpdate: fireUpdateAtEdges, behavior: !useAnimations ? BEHAVIOR_INSTANT : ((this.animationParams.scrollToItem > 0 && this.scrollBehavior !== BEHAVIOR_INSTANT) ? BEHAVIOR_AUTO : BEHAVIOR_INSTANT), userAction: false,
9541
+ blending: useAnimations && scroller.hasAnimation(this._animationId) || cacheChanged, duration: this.animationParams.scrollToItem,
9482
9542
  };
9483
9543
  const animationId = scroller?.scrollTo?.(params);
9484
9544
  if (animationId > -1) {
@@ -9491,37 +9551,8 @@ class NgVirtualListComponent extends DisposableComponent {
9491
9551
  if (emitUpdate) {
9492
9552
  this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
9493
9553
  }
9554
+ return;
9494
9555
  }
9495
- return;
9496
- }
9497
- if ((snapScrollToEnd && this._trackBox.isSnappedToEnd) || (snapScrollToEnd && !scroller.scrollable) ||
9498
- (scrollPositionAfterUpdate + MIN_PIXELS_FOR_PREVENT_SNAPPING >= roundedMaxPositionAfterUpdate) ||
9499
- (roundedScrollPositionAfterUpdate >= scrollPositionAfterUpdate + MIN_PIXELS_FOR_PREVENT_SNAPPING)) {
9500
- this._trackBox.clearDelta();
9501
- if (!this._trackBox.isSnappedToEnd) {
9502
- this._trackBox.isScrollEnd = true;
9503
- this._trackBox.isScrollStart = false;
9504
- }
9505
- if (this._readyForShow) {
9506
- this.emitScrollEvent(true, false, false);
9507
- }
9508
- const params = {
9509
- [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: roundedMaxPositionAfterUpdate,
9510
- fireUpdate: fireUpdateAtEdges, behavior: !useAnimations ? BEHAVIOR_INSTANT : ((this.animationParams.scrollToItem > 0 && this.scrollBehavior !== BEHAVIOR_INSTANT) ? BEHAVIOR_AUTO : BEHAVIOR_INSTANT), userAction: false,
9511
- blending: useAnimations && scroller.hasAnimation(this._animationId) || cacheChanged, duration: this.animationParams.scrollToItem,
9512
- };
9513
- const animationId = scroller?.scrollTo?.(params);
9514
- if (animationId > -1) {
9515
- this._animationId = animationId;
9516
- }
9517
- else {
9518
- scroller.stopAnimation(this._animationId);
9519
- }
9520
- scroller?.scrollTo?.(params);
9521
- if (emitUpdate) {
9522
- this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
9523
- }
9524
- return;
9525
9556
  }
9526
9557
  if (scrollSize !== scrollPositionAfterUpdate &&
9527
9558
  ((scrollPositionAfterUpdate >= 0 && scrollPositionAfterUpdate < roundedMaxPositionAfterUpdate) ||
@@ -9661,23 +9692,23 @@ class NgVirtualListComponent extends DisposableComponent {
9661
9692
  if (!!items && items.length) {
9662
9693
  const dynamicSize = this.dynamicSize, itemSize = this.actualItemSize, minItemSize = this.actualMinItemSize, maxItemSize = this.actualMaxItemSize, snapScrollToEnd = this.snapScrollToEnd;
9663
9694
  if (dynamicSize) {
9664
- const { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, itemConfigMap = this.itemConfigMap, isVertical = this._isVertical, currentScrollSize = isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft, opts = {
9665
- alignment: this._$actualAlignment.getValue(),
9695
+ const { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, itemConfigMap = this.itemConfigMap, isVertical = this._isVertical, inverted = scrollerComponent.inverted, maxScrollSize = isVertical ? scrollerComponent.scrollHeight : scrollerComponent.scrollWidth, currentScrollSize = isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft, opts = {
9696
+ alignment: this.actualAlignment, inverted,
9666
9697
  bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize, minItemSize, maxItemSize,
9667
9698
  bufferSize: this.bufferSize, maxBufferSize: this.maxBufferSize, itemTransform: this.itemTransform,
9668
- scrollSize: (isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft),
9699
+ scrollSize: (inverted ? (maxScrollSize - currentScrollSize) : currentScrollSize),
9669
9700
  snapToItem: this.snapToItem, snapToItemAlign: this.snapToItemAlign,
9670
9701
  stickyEnabled: this.stickyEnabled, fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization,
9671
9702
  };
9672
9703
  let scrollSize = snapScrollToEnd && this._trackBox.isSnappedToEnd ?
9673
- (isVertical ? scrollerComponent.scrollHeight : scrollerComponent.scrollWidth) :
9704
+ maxScrollSize :
9674
9705
  this._trackBox.getItemPosition(id, itemConfigMap, opts);
9675
9706
  if (scrollSize === -1) {
9676
9707
  return of([finished, { id, blending, iteration: nextIteration, cb }]).pipe(delay(0));
9677
9708
  }
9678
9709
  this._trackBox.clearDelta();
9679
9710
  const viewportSize = (isVertical ? height : width), { displayItems, totalSize, leftLayoutOffset } = this._trackBox.updateCollection(items, itemConfigMap, {
9680
- ...opts, scrollSize, fromItemId: isLastIteration ? undefined : id,
9711
+ ...opts, scrollSize: (inverted ? (maxScrollSize - scrollSize) : scrollSize), fromItemId: isLastIteration ? undefined : id,
9681
9712
  }), delta1 = this._trackBox.delta;
9682
9713
  const normalizedTotalSize = totalSize < viewportSize ? viewportSize : totalSize;
9683
9714
  scrollerComponent.startLayoutOffset = leftLayoutOffset;
@@ -9689,7 +9720,7 @@ class NgVirtualListComponent extends DisposableComponent {
9689
9720
  this.tracking();
9690
9721
  this.snappingHandler();
9691
9722
  this.updateOffsetsByAllignment();
9692
- scrollSize = this._trackBox.getItemPosition(id, itemConfigMap, { ...opts, scrollSize: actualScrollSize, fromItemId: id });
9723
+ scrollSize = this._trackBox.getItemPosition(id, itemConfigMap, { ...opts, scrollSize: (inverted ? (maxScrollSize - actualScrollSize) : actualScrollSize), fromItemId: id });
9693
9724
  if (scrollSize === -1) {
9694
9725
  return of([finished, { id, blending, iteration: nextIteration, cb }]).pipe(delay(0));
9695
9726
  }
@@ -9714,11 +9745,11 @@ class NgVirtualListComponent extends DisposableComponent {
9714
9745
  else {
9715
9746
  const index = items.findIndex(item => item[trackBy] === id);
9716
9747
  if (index > -1) {
9717
- const isVertical = this._isVertical, itemSize = this.actualItemSize;
9748
+ const isVertical = this._isVertical, itemSize = this.actualItemSize, isInfinity = this.isInfinity, snapToItem = this.snapToItem, snapToItemAlign = this.snapToItemAlign;
9718
9749
  let scrollSize = index * itemSize;
9719
- if (this.isInfinity) {
9720
- if (this.snapToItem) {
9721
- switch (this.snapToItemAlign) {
9750
+ if (isInfinity) {
9751
+ if (snapToItem) {
9752
+ switch (snapToItemAlign) {
9722
9753
  case SnapToItemAligns.CENTER: {
9723
9754
  scrollSize += itemSize * .5;
9724
9755
  break;
@@ -9726,17 +9757,18 @@ class NgVirtualListComponent extends DisposableComponent {
9726
9757
  }
9727
9758
  }
9728
9759
  }
9729
- const { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, itemConfigMap = this.itemConfigMap, items = this._$actualItems.getValue(), opts = {
9730
- alignment: this._$actualAlignment.getValue(),
9760
+ const { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, itemConfigMap = this.itemConfigMap, items = this._$actualItems.getValue(), inverted = scrollerComponent.inverted, maxScrollSize = (isVertical ? scrollerComponent.scrollHeight : scrollerComponent.scrollWidth), actualScrollSize = (isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft), opts = {
9761
+ alignment: this.actualAlignment, inverted,
9731
9762
  bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize, minItemSize, maxItemSize,
9732
9763
  bufferSize: this.bufferSize, maxBufferSize: this.maxBufferSize, itemTransform: this.itemTransform,
9733
- scrollSize: (isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft),
9734
- snapToItem: this.snapToItem, snapToItemAlign: this.snapToItemAlign,
9735
- stickyEnabled: this.stickyEnabled, fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization,
9764
+ scrollSize: (inverted ? (maxScrollSize - actualScrollSize) : actualScrollSize),
9765
+ snapToItem, snapToItemAlign, stickyEnabled: this.stickyEnabled, fromItemId: id,
9766
+ enabledBufferOptimization: this.enabledBufferOptimization,
9736
9767
  };
9737
9768
  this._trackBox.clearDelta();
9738
9769
  const viewportSize = (isVertical ? height : width), { displayItems, totalSize, leftLayoutOffset } = this._trackBox.updateCollection(items, itemConfigMap, {
9739
- ...opts, scrollSize, fromItemId: isLastIteration ? undefined : id,
9770
+ ...opts, scrollSize: (inverted ? (maxScrollSize - scrollSize) : scrollSize),
9771
+ fromItemId: isLastIteration ? undefined : id,
9740
9772
  });
9741
9773
  const actualTotalSize = this.isInfinity ? (totalSize + viewportSize) : totalSize;
9742
9774
  const normalizedTotalSize = actualTotalSize < viewportSize ? viewportSize : actualTotalSize;
@@ -10259,13 +10291,13 @@ class NgVirtualListComponent extends DisposableComponent {
10259
10291
  }
10260
10292
  }
10261
10293
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10262
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { scrollbarThickness: "scrollbarThickness", scrollbarMinSize: "scrollbarMinSize", scrollbarThumbRenderer: "scrollbarThumbRenderer", scrollbarThumbParams: "scrollbarThumbParams", loading: "loading", waitForPreparation: "waitForPreparation", clickDistance: "clickDistance", items: "items", selectedIds: "selectedIds", defaultItemValue: "defaultItemValue", collapsedIds: "collapsedIds", selectByClick: "selectByClick", collapseByClick: "collapseByClick", snap: "snap", stickyEnabled: "stickyEnabled", snapToEndTransitionInstantOffset: "snapToEndTransitionInstantOffset", scrollStartOffset: "scrollStartOffset", scrollEndOffset: "scrollEndOffset", snapScrollToStart: "snapScrollToStart", snapScrollToEnd: "snapScrollToEnd", snapScrollToBottom: "snapScrollToBottom", scrollbarEnabled: "scrollbarEnabled", scrollbarInteractive: "scrollbarInteractive", overlappingScrollbar: "overlappingScrollbar", scrollBehavior: "scrollBehavior", scrollingSettings: "scrollingSettings", itemTransform: "itemTransform", snapToItem: "snapToItem", snapToItemAlign: "snapToItemAlign", snappingDistance: "snappingDistance", scrollingOneByOne: "scrollingOneByOne", alignment: "alignment", zIndexWhenSelecting: "zIndexWhenSelecting", spreadingMode: "spreadingMode", divides: "divides", motionBlur: "motionBlur", maxMotionBlur: "maxMotionBlur", motionBlurEnabled: "motionBlurEnabled", animationParams: "animationParams", overscrollEnabled: "overscrollEnabled", enabledBufferOptimization: "enabledBufferOptimization", itemRenderer: "itemRenderer", itemConfigMap: "itemConfigMap", itemSize: "itemSize", minItemSize: "minItemSize", maxItemSize: "maxItemSize", dynamicSize: "dynamicSize", direction: "direction", collectionMode: "collectionMode", bufferSize: "bufferSize", maxBufferSize: "maxBufferSize", snappingMethod: "snappingMethod", collapsingMode: "collapsingMode", methodForSelecting: "methodForSelecting", selectingMode: "selectingMode", trackBy: "trackBy", screenReaderMessage: "screenReaderMessage", langTextDir: "langTextDir" }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd", onViewportChange: "onViewportChange", onSnapItem: "onSnapItem", onItemClick: "onItemClick", onSelect: "onSelect", onCollapse: "onCollapse", onScrollReachStart: "onScrollReachStart", onScrollReachEnd: "onScrollReachEnd" }, host: { styleAttribute: "position: relative;" }, providers: [NgVirtualListService, NgVirtualListPublicService], viewQueries: [{ propertyName: "_prerender", first: true, predicate: ["prerender"], descendants: true, read: NgPrerenderContainer }, { propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_snapContainerRef", first: true, predicate: ["snapRendererContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollerComponent", first: true, predicate: ["scroller"], descendants: true, read: NgScrollerComponent }], usesInheritance: true, ngImport: i0, template: "<div aria-live=\"polite\" aria-atomic=\"true\" class=\"ngvl__screen-reader\">\r\n {{ $screenReaderFormattedMessage | async }}\r\n</div>\r\n\r\n<ng-prerender-container #prerender [bounds]=\"($bounds | async)!\" [direction]=\"($direction | async)!\"\r\n [dynamic]=\"($dynamicSize | async)!\" [divides]=\"($divides | async)!\" [isVertical]=\"($isVertical | async)!\"\r\n [itemSize]=\"($actualItemSize | async)!\" [trackBy]=\"($trackBy | async)!\" [itemRenderer]=\"($itemRenderer | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [scrollbarEnabled]=\"(scroller.$scrollbarShow | async)!\"\r\n [enabled]=\"($prerenderEnabled | async)!\"></ng-prerender-container>\r\n\r\n<ng-container *ngIf=\"($stickyEnabled | async)!\">\r\n <div localeSensitive [langTextDir]=\"($langTextDir | async)!\" #snappedContainer class=\"ngvl__snapped-container\"\r\n [ngClass]=\"($classes | async)\">\r\n <div #snapped part=\"snapped-item\" class=\"ngvl__list-snapper\">\r\n <ng-container #snapRendererContainer></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-scroller #scroller class=\"ngvl__list-scroller\" [classes]=\"($classes | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [alignmentStartOffset]=\"($alignmentScrollStartOffset | async)!\"\r\n [alignmentEndOffset]=\"($alignmentScrollEndOffset | async)!\" [direction]=\"($direction | async)!\"\r\n [scrollbarThumbRenderer]=\"($scrollbarThumbRenderer | async)!\" [isInfinity]=\"($isInfinity | async)!\"\r\n [scrollbarThickness]=\"($scrollbarThickness | async)!\" [scrollbarThumbParams]=\"($scrollbarThumbParams | async)!\"\r\n [animationParams]=\"($animationParams | async)!\" [focusedElement]=\"($focusedElement | async)!\"\r\n [loading]=\"($loading | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [snappingDistance]=\"($snappingDistance | async)!\" [overlappingScrollbar]=\"($overlappingScrollbar | async)!\"\r\n [scrollbarEnabled]=\"($actualScrollbarEnabled | async)!\" [scrollbarInteractive]=\"($scrollbarInteractive | async)!\"\r\n [snapToItem]=\"($snapToItem | async)!\" [snapToItemAlign]=\"($snapToItemAlign | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollingSettings]=\"($scrollingSettings | async)!\" [scrollingOneByOne]=\"($scrollingOneByOne | async)!\"\r\n [motionBlur]=\"($motionBlur | async)!\" [maxMotionBlur]=\"($maxMotionBlur | async)!\"\r\n [motionBlurEnabled]=\"($motionBlurEnabled | async)!\">\r\n <ng-container #renderersContainer></ng-container>\r\n</ng-scroller>", styles: [":host{position:relative;display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__snapped-container{position:relative;width:100%;opacity:0}.ngvl__snapped-container.prepared{opacity:1}.ngvl__list-snapper{-webkit-tap-highlight-color:transparent;position:absolute;list-style:none;left:0;top:0;z-index:1}.ngvl__list-scroller{-webkit-tap-highlight-color:transparent;position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.ngvl__screen-reader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgScrollerComponent, selector: "ng-scroller", inputs: ["scrollbarEnabled", "scrollbarInteractive", "focusedElement", "overlappingScrollbar", "content", "loading", "classes", "scrollbarMinSize", "scrollbarThickness", "scrollbarThumbRenderer", "scrollbarThumbParams", "motionBlur", "maxMotionBlur", "motionBlurEnabled"], outputs: ["onScrollbarVisible"] }, { kind: "component", type: NgPrerenderContainer, selector: "ng-prerender-container", inputs: ["enabled", "direction", "isVertical", "scrollbarEnabled", "startOffset", "endOffset", "bounds", "dynamic", "itemSize", "trackBy", "divides"] }, { kind: "directive", type: LocaleSensitiveDirective, selector: "[localeSensitive]", inputs: ["langTextDir", "listDir"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
10294
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { scrollbarThickness: "scrollbarThickness", scrollbarMinSize: "scrollbarMinSize", scrollbarThumbRenderer: "scrollbarThumbRenderer", scrollbarThumbParams: "scrollbarThumbParams", loading: "loading", waitForPreparation: "waitForPreparation", clickDistance: "clickDistance", items: "items", selectedIds: "selectedIds", defaultItemValue: "defaultItemValue", collapsedIds: "collapsedIds", selectByClick: "selectByClick", collapseByClick: "collapseByClick", snap: "snap", stickyEnabled: "stickyEnabled", snapToEndTransitionInstantOffset: "snapToEndTransitionInstantOffset", scrollStartOffset: "scrollStartOffset", scrollEndOffset: "scrollEndOffset", snapScrollToStart: "snapScrollToStart", snapScrollToEnd: "snapScrollToEnd", snapScrollToBottom: "snapScrollToBottom", scrollbarEnabled: "scrollbarEnabled", scrollbarInteractive: "scrollbarInteractive", overlappingScrollbar: "overlappingScrollbar", scrollBehavior: "scrollBehavior", scrollingSettings: "scrollingSettings", itemTransform: "itemTransform", snapToItem: "snapToItem", snapToItemAlign: "snapToItemAlign", snappingDistance: "snappingDistance", scrollingOneByOne: "scrollingOneByOne", alignment: "alignment", zIndexWhenSelecting: "zIndexWhenSelecting", spreadingMode: "spreadingMode", divides: "divides", motionBlur: "motionBlur", maxMotionBlur: "maxMotionBlur", motionBlurEnabled: "motionBlurEnabled", animationParams: "animationParams", overscrollEnabled: "overscrollEnabled", enabledBufferOptimization: "enabledBufferOptimization", itemRenderer: "itemRenderer", itemConfigMap: "itemConfigMap", itemSize: "itemSize", minItemSize: "minItemSize", maxItemSize: "maxItemSize", dynamicSize: "dynamicSize", direction: "direction", collectionMode: "collectionMode", bufferSize: "bufferSize", maxBufferSize: "maxBufferSize", snappingMethod: "snappingMethod", collapsingMode: "collapsingMode", methodForSelecting: "methodForSelecting", selectingMode: "selectingMode", trackBy: "trackBy", screenReaderMessage: "screenReaderMessage", langTextDir: "langTextDir" }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd", onViewportChange: "onViewportChange", onSnapItem: "onSnapItem", onItemClick: "onItemClick", onSelect: "onSelect", onCollapse: "onCollapse", onScrollReachStart: "onScrollReachStart", onScrollReachEnd: "onScrollReachEnd" }, host: { styleAttribute: "position: relative;" }, providers: [NgVirtualListService, NgVirtualListPublicService], viewQueries: [{ propertyName: "_prerender", first: true, predicate: ["prerender"], descendants: true, read: NgPrerenderContainer }, { propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_snapContainerRef", first: true, predicate: ["snapRendererContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollerComponent", first: true, predicate: ["scroller"], descendants: true, read: NgScrollerComponent }], usesInheritance: true, ngImport: i0, template: "<div aria-live=\"polite\" aria-atomic=\"true\" class=\"ngvl__screen-reader\">\r\n {{ $screenReaderFormattedMessage | async }}\r\n</div>\r\n\r\n<ng-prerender-container #prerender [bounds]=\"($bounds | async)!\" [direction]=\"($direction | async)!\"\r\n [dynamic]=\"($dynamicSize | async)!\" [divides]=\"($divides | async)!\" [isVertical]=\"($isVertical | async)!\"\r\n [itemSize]=\"($actualItemSize | async)!\" [trackBy]=\"($trackBy | async)!\" [itemRenderer]=\"($itemRenderer | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [scrollbarEnabled]=\"(scroller.$scrollbarShow | async)!\"\r\n [enabled]=\"($prerenderEnabled | async)!\"></ng-prerender-container>\r\n\r\n<ng-container *ngIf=\"($stickyEnabled | async)!\">\r\n <div localeSensitive [langTextDir]=\"($langTextDir | async)!\" #snappedContainer class=\"ngvl__snapped-container\"\r\n [ngClass]=\"($classes | async)\">\r\n <div #snapped part=\"snapped-item\" class=\"ngvl__list-snapper\">\r\n <ng-container #snapRendererContainer></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-scroller #scroller class=\"ngvl__list-scroller\" [classes]=\"($classes | async)!\"\r\n [langTextDir]=\"($langTextDir | async)!\" [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [alignmentStartOffset]=\"($alignmentScrollStartOffset | async)!\"\r\n [alignmentEndOffset]=\"($alignmentScrollEndOffset | async)!\" [direction]=\"($direction | async)!\"\r\n [scrollbarThumbRenderer]=\"($scrollbarThumbRenderer | async)!\" [isInfinity]=\"($isInfinity | async)!\"\r\n [scrollbarThickness]=\"($scrollbarThickness | async)!\" [scrollbarThumbParams]=\"($scrollbarThumbParams | async)!\"\r\n [animationParams]=\"($animationParams | async)!\" [focusedElement]=\"($focusedElement | async)!\"\r\n [loading]=\"($loading | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [snappingDistance]=\"($snappingDistance | async)!\" [overlappingScrollbar]=\"($overlappingScrollbar | async)!\"\r\n [scrollbarEnabled]=\"($actualScrollbarEnabled | async)!\" [scrollbarInteractive]=\"($scrollbarInteractive | async)!\"\r\n [snapToItem]=\"($snapToItem | async)!\" [snapToItemAlign]=\"($snapToItemAlign | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollingSettings]=\"($scrollingSettings | async)!\" [scrollingOneByOne]=\"($scrollingOneByOne | async)!\"\r\n [motionBlur]=\"($motionBlur | async)!\" [maxMotionBlur]=\"($maxMotionBlur | async)!\"\r\n [motionBlurEnabled]=\"($motionBlurEnabled | async)!\">\r\n <ng-container #renderersContainer></ng-container>\r\n</ng-scroller>", styles: [":host{position:relative;display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__snapped-container{position:relative;width:100%;opacity:0}.ngvl__snapped-container.prepared{opacity:1}.ngvl__list-snapper{-webkit-tap-highlight-color:transparent;position:absolute;list-style:none;left:0;top:0;z-index:1}.ngvl__list-scroller{-webkit-tap-highlight-color:transparent;position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.ngvl__screen-reader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgScrollerComponent, selector: "ng-scroller", inputs: ["scrollbarEnabled", "scrollbarInteractive", "focusedElement", "overlappingScrollbar", "content", "loading", "classes", "scrollbarMinSize", "scrollbarThickness", "scrollbarThumbRenderer", "scrollbarThumbParams", "motionBlur", "maxMotionBlur", "motionBlurEnabled"], outputs: ["onScrollbarVisible"] }, { kind: "component", type: NgPrerenderContainer, selector: "ng-prerender-container", inputs: ["enabled", "direction", "isVertical", "scrollbarEnabled", "startOffset", "endOffset", "bounds", "dynamic", "itemSize", "trackBy", "divides"] }, { kind: "directive", type: LocaleSensitiveDirective, selector: "[localeSensitive]", inputs: ["langTextDir", "listDir"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
10263
10295
  }
10264
10296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgVirtualListComponent, decorators: [{
10265
10297
  type: Component,
10266
10298
  args: [{ selector: 'ng-virtual-list', host: {
10267
10299
  'style': 'position: relative;'
10268
- }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, providers: [NgVirtualListService, NgVirtualListPublicService], template: "<div aria-live=\"polite\" aria-atomic=\"true\" class=\"ngvl__screen-reader\">\r\n {{ $screenReaderFormattedMessage | async }}\r\n</div>\r\n\r\n<ng-prerender-container #prerender [bounds]=\"($bounds | async)!\" [direction]=\"($direction | async)!\"\r\n [dynamic]=\"($dynamicSize | async)!\" [divides]=\"($divides | async)!\" [isVertical]=\"($isVertical | async)!\"\r\n [itemSize]=\"($actualItemSize | async)!\" [trackBy]=\"($trackBy | async)!\" [itemRenderer]=\"($itemRenderer | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [scrollbarEnabled]=\"(scroller.$scrollbarShow | async)!\"\r\n [enabled]=\"($prerenderEnabled | async)!\"></ng-prerender-container>\r\n\r\n<ng-container *ngIf=\"($stickyEnabled | async)!\">\r\n <div localeSensitive [langTextDir]=\"($langTextDir | async)!\" #snappedContainer class=\"ngvl__snapped-container\"\r\n [ngClass]=\"($classes | async)\">\r\n <div #snapped part=\"snapped-item\" class=\"ngvl__list-snapper\">\r\n <ng-container #snapRendererContainer></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-scroller #scroller class=\"ngvl__list-scroller\" [classes]=\"($classes | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [alignmentStartOffset]=\"($alignmentScrollStartOffset | async)!\"\r\n [alignmentEndOffset]=\"($alignmentScrollEndOffset | async)!\" [direction]=\"($direction | async)!\"\r\n [scrollbarThumbRenderer]=\"($scrollbarThumbRenderer | async)!\" [isInfinity]=\"($isInfinity | async)!\"\r\n [scrollbarThickness]=\"($scrollbarThickness | async)!\" [scrollbarThumbParams]=\"($scrollbarThumbParams | async)!\"\r\n [animationParams]=\"($animationParams | async)!\" [focusedElement]=\"($focusedElement | async)!\"\r\n [loading]=\"($loading | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [snappingDistance]=\"($snappingDistance | async)!\" [overlappingScrollbar]=\"($overlappingScrollbar | async)!\"\r\n [scrollbarEnabled]=\"($actualScrollbarEnabled | async)!\" [scrollbarInteractive]=\"($scrollbarInteractive | async)!\"\r\n [snapToItem]=\"($snapToItem | async)!\" [snapToItemAlign]=\"($snapToItemAlign | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollingSettings]=\"($scrollingSettings | async)!\" [scrollingOneByOne]=\"($scrollingOneByOne | async)!\"\r\n [motionBlur]=\"($motionBlur | async)!\" [maxMotionBlur]=\"($maxMotionBlur | async)!\"\r\n [motionBlurEnabled]=\"($motionBlurEnabled | async)!\">\r\n <ng-container #renderersContainer></ng-container>\r\n</ng-scroller>", styles: [":host{position:relative;display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__snapped-container{position:relative;width:100%;opacity:0}.ngvl__snapped-container.prepared{opacity:1}.ngvl__list-snapper{-webkit-tap-highlight-color:transparent;position:absolute;list-style:none;left:0;top:0;z-index:1}.ngvl__list-scroller{-webkit-tap-highlight-color:transparent;position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.ngvl__screen-reader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
10300
+ }, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, providers: [NgVirtualListService, NgVirtualListPublicService], template: "<div aria-live=\"polite\" aria-atomic=\"true\" class=\"ngvl__screen-reader\">\r\n {{ $screenReaderFormattedMessage | async }}\r\n</div>\r\n\r\n<ng-prerender-container #prerender [bounds]=\"($bounds | async)!\" [direction]=\"($direction | async)!\"\r\n [dynamic]=\"($dynamicSize | async)!\" [divides]=\"($divides | async)!\" [isVertical]=\"($isVertical | async)!\"\r\n [itemSize]=\"($actualItemSize | async)!\" [trackBy]=\"($trackBy | async)!\" [itemRenderer]=\"($itemRenderer | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [scrollbarEnabled]=\"(scroller.$scrollbarShow | async)!\"\r\n [enabled]=\"($prerenderEnabled | async)!\"></ng-prerender-container>\r\n\r\n<ng-container *ngIf=\"($stickyEnabled | async)!\">\r\n <div localeSensitive [langTextDir]=\"($langTextDir | async)!\" #snappedContainer class=\"ngvl__snapped-container\"\r\n [ngClass]=\"($classes | async)\">\r\n <div #snapped part=\"snapped-item\" class=\"ngvl__list-snapper\">\r\n <ng-container #snapRendererContainer></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-scroller #scroller class=\"ngvl__list-scroller\" [classes]=\"($classes | async)!\"\r\n [langTextDir]=\"($langTextDir | async)!\" [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [alignmentStartOffset]=\"($alignmentScrollStartOffset | async)!\"\r\n [alignmentEndOffset]=\"($alignmentScrollEndOffset | async)!\" [direction]=\"($direction | async)!\"\r\n [scrollbarThumbRenderer]=\"($scrollbarThumbRenderer | async)!\" [isInfinity]=\"($isInfinity | async)!\"\r\n [scrollbarThickness]=\"($scrollbarThickness | async)!\" [scrollbarThumbParams]=\"($scrollbarThumbParams | async)!\"\r\n [animationParams]=\"($animationParams | async)!\" [focusedElement]=\"($focusedElement | async)!\"\r\n [loading]=\"($loading | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [snappingDistance]=\"($snappingDistance | async)!\" [overlappingScrollbar]=\"($overlappingScrollbar | async)!\"\r\n [scrollbarEnabled]=\"($actualScrollbarEnabled | async)!\" [scrollbarInteractive]=\"($scrollbarInteractive | async)!\"\r\n [snapToItem]=\"($snapToItem | async)!\" [snapToItemAlign]=\"($snapToItemAlign | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollingSettings]=\"($scrollingSettings | async)!\" [scrollingOneByOne]=\"($scrollingOneByOne | async)!\"\r\n [motionBlur]=\"($motionBlur | async)!\" [maxMotionBlur]=\"($maxMotionBlur | async)!\"\r\n [motionBlurEnabled]=\"($motionBlurEnabled | async)!\">\r\n <ng-container #renderersContainer></ng-container>\r\n</ng-scroller>", styles: [":host{position:relative;display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__snapped-container{position:relative;width:100%;opacity:0}.ngvl__snapped-container.prepared{opacity:1}.ngvl__list-snapper{-webkit-tap-highlight-color:transparent;position:absolute;list-style:none;left:0;top:0;z-index:1}.ngvl__list-scroller{-webkit-tap-highlight-color:transparent;position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.ngvl__screen-reader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
10269
10301
  }], ctorParameters: function () { return []; }, propDecorators: { _prerender: [{
10270
10302
  type: ViewChild,
10271
10303
  args: ['prerender', { read: NgPrerenderContainer }]