carriera-intern-components 1.1.51 → 1.1.52

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.
@@ -12,6 +12,11 @@ export declare class StickyScrollbarComponent implements AfterViewInit, OnChange
12
12
  * Hide the scrollbar track completely
13
13
  */
14
14
  hideTrack: boolean;
15
+ /**
16
+ * Keep scrollbar fixed at bottom of viewport even when table scrolls out of view
17
+ * @default false
18
+ */
19
+ alwaysVisible: boolean;
15
20
  /**
16
21
  * Offset for the sticky position from the bottom (in pixels)
17
22
  * @default 0
@@ -28,65 +33,31 @@ export declare class StickyScrollbarComponent implements AfterViewInit, OnChange
28
33
  private readonly renderer;
29
34
  private readonly destroyRef;
30
35
  isDragging: boolean;
36
+ isContainerInView: import("@angular/core").WritableSignal<boolean>;
31
37
  private dragStartX;
32
38
  private scrollStartLeft;
33
39
  private isSettingScrollPosition;
34
40
  private currentScrollState?;
35
41
  private setPositionTimeout?;
36
- private dragStart$;
37
- private dragEnd$;
42
+ private intersectionObserver?;
38
43
  ngOnChanges(changes: SimpleChanges): void;
39
44
  ngAfterViewInit(): void;
40
- /**
41
- * Applies the scroll position from input (programmatically)
42
- */
43
45
  private applyScrollPosition;
44
- /**
45
- * Updates scrollbar thumb size and position based on content
46
- */
47
46
  private updateScrollbar;
48
- /**
49
- * Observes container resize to update scrollbar
50
- */
51
47
  private setupResizeObserver;
52
- /**
53
- * Updates scroll state and emits the state change event
54
- */
48
+ private setupAlwaysVisibleTracking;
49
+ private updateFixedTrackPosition;
55
50
  private updateScrollState;
56
- /**
57
- * Calculates the scroll state based on current scroll position
58
- */
59
51
  private calculateScrollState;
60
- /**
61
- * Handles scroll event on the container
62
- */
63
52
  onScroll(): void;
64
- /**
65
- * Handles mouse down on scrollbar thumb
66
- */
67
53
  onThumbMouseDown(event: MouseEvent): void;
68
- /**
69
- * Sets up drag event listeners (called once during initialization)
70
- */
71
- private setupDragListeners;
72
- /**
73
- * Handles thumb dragging
74
- */
54
+ onWindowMouseMove(event: MouseEvent): void;
55
+ onWindowMouseUp(): void;
56
+ onWindowMouseLeave(): void;
75
57
  private onThumbDrag;
76
- /**
77
- * Handles mouse up to end dragging
78
- */
79
58
  onThumbMouseUp(): void;
80
- /**
81
- * Public method to manually refresh the scrollbar
82
- * Useful when content or container dimensions change programmatically
83
- */
84
59
  refresh(): void;
85
- /**
86
- * Public method to scroll to the end of the container
87
- * Useful when resizing the last element or when you want to ensure the end is visible
88
- */
89
60
  scrollToEnd(): void;
90
61
  static ɵfac: i0.ɵɵFactoryDeclaration<StickyScrollbarComponent, never>;
91
- static ɵcmp: i0.ɵɵComponentDeclaration<StickyScrollbarComponent, "ca-sticky-scrollbar", never, { "scrollPosition": { "alias": "scrollPosition"; "required": false; }; "hideTrack": { "alias": "hideTrack"; "required": false; }; "stickyOffset": { "alias": "stickyOffset"; "required": false; }; }, { "scrollPositionChange": "scrollPositionChange"; "scrollStateChange": "scrollStateChange"; }, never, ["*"], true, never>;
62
+ static ɵcmp: i0.ɵɵComponentDeclaration<StickyScrollbarComponent, "ca-sticky-scrollbar", never, { "scrollPosition": { "alias": "scrollPosition"; "required": false; }; "hideTrack": { "alias": "hideTrack"; "required": false; }; "alwaysVisible": { "alias": "alwaysVisible"; "required": false; }; "stickyOffset": { "alias": "stickyOffset"; "required": false; }; }, { "scrollPositionChange": "scrollPositionChange"; "scrollStateChange": "scrollStateChange"; }, never, ["*"], true, never>;
92
63
  }
@@ -12,12 +12,11 @@ import { ImageCropperComponent } from 'ngx-image-cropper';
12
12
  import * as pdfjsLib from 'pdfjs-dist';
13
13
  import * as i1$1 from '@angular/platform-browser';
14
14
  import moment from 'moment';
15
- import { Subject, takeUntil, distinctUntilChanged as distinctUntilChanged$1, tap, filter, debounceTime, switchMap, of, catchError, fromEvent } from 'rxjs';
15
+ import { Subject, takeUntil, distinctUntilChanged as distinctUntilChanged$1, tap, filter, debounceTime, switchMap, of, catchError } from 'rxjs';
16
16
  import { distinctUntilChanged, takeUntil as takeUntil$1 } from 'rxjs/operators';
17
17
  import * as i3 from '@angular/cdk/scrolling';
18
18
  import { ScrollingModule, VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling';
19
19
  import * as i1$3 from '@angular/cdk/clipboard';
20
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
21
20
 
22
21
  /**
23
22
  * Creates a validator that ignores validation rules when the control is autofilled.
@@ -8832,7 +8831,6 @@ var eScrollState;
8832
8831
  eScrollState["NOT_NEEDED"] = "not_needed";
8833
8832
  })(eScrollState || (eScrollState = {}));
8834
8833
 
8835
- // Angular Core
8836
8834
  class StickyScrollbarComponent {
8837
8835
  scrollContainer;
8838
8836
  scrollThumb;
@@ -8844,6 +8842,11 @@ class StickyScrollbarComponent {
8844
8842
  * Hide the scrollbar track completely
8845
8843
  */
8846
8844
  hideTrack = false;
8845
+ /**
8846
+ * Keep scrollbar fixed at bottom of viewport even when table scrolls out of view
8847
+ * @default false
8848
+ */
8849
+ alwaysVisible = false;
8847
8850
  /**
8848
8851
  * Offset for the sticky position from the bottom (in pixels)
8849
8852
  * @default 0
@@ -8860,40 +8863,47 @@ class StickyScrollbarComponent {
8860
8863
  renderer = inject(Renderer2);
8861
8864
  destroyRef = inject(DestroyRef);
8862
8865
  isDragging = false;
8866
+ isContainerInView = signal(true);
8863
8867
  dragStartX = 0;
8864
8868
  scrollStartLeft = 0;
8865
8869
  isSettingScrollPosition = false;
8866
8870
  currentScrollState;
8867
8871
  setPositionTimeout;
8868
- dragStart$ = new Subject();
8869
- dragEnd$ = new Subject();
8872
+ intersectionObserver;
8870
8873
  ngOnChanges(changes) {
8871
8874
  if (changes['scrollPosition'] && !changes['scrollPosition'].firstChange) {
8872
8875
  this.applyScrollPosition();
8873
8876
  }
8877
+ if (changes['alwaysVisible']?.currentValue &&
8878
+ !changes['alwaysVisible'].firstChange) {
8879
+ this.setupAlwaysVisibleTracking();
8880
+ }
8881
+ if (changes['stickyOffset'] &&
8882
+ !changes['stickyOffset'].firstChange &&
8883
+ this.alwaysVisible) {
8884
+ // IntersectionObserver will handle visibility updates automatically
8885
+ this.updateFixedTrackPosition();
8886
+ }
8874
8887
  }
8875
8888
  ngAfterViewInit() {
8876
8889
  this.updateScrollbar();
8877
8890
  this.setupResizeObserver();
8878
- this.setupDragListeners();
8879
- // Apply initial scroll position if provided
8880
8891
  if (this.scrollPosition !== undefined) {
8881
8892
  this.applyScrollPosition();
8882
8893
  }
8883
- // Set initial scroll state to Start
8884
8894
  this.updateScrollState(eScrollState.START);
8885
- // Cleanup on destroy
8895
+ if (this.alwaysVisible && !this.hideTrack) {
8896
+ this.setupAlwaysVisibleTracking();
8897
+ }
8886
8898
  this.destroyRef.onDestroy(() => {
8887
8899
  if (this.setPositionTimeout) {
8888
8900
  clearTimeout(this.setPositionTimeout);
8889
8901
  }
8890
- this.dragStart$.complete();
8891
- this.dragEnd$.complete();
8902
+ if (this.intersectionObserver) {
8903
+ this.intersectionObserver.disconnect();
8904
+ }
8892
8905
  });
8893
8906
  }
8894
- /**
8895
- * Applies the scroll position from input (programmatically)
8896
- */
8897
8907
  applyScrollPosition() {
8898
8908
  if (this.scrollPosition === undefined || !this.scrollContainer) {
8899
8909
  return;
@@ -8901,45 +8911,38 @@ class StickyScrollbarComponent {
8901
8911
  this.isSettingScrollPosition = true;
8902
8912
  this.scrollContainer.nativeElement.scrollLeft = this.scrollPosition;
8903
8913
  this.updateScrollbar();
8904
- // Calculate and emit scroll state based on new position
8905
8914
  const newState = this.calculateScrollState();
8906
8915
  this.updateScrollState(newState);
8907
- // Clear any existing timeout
8908
8916
  if (this.setPositionTimeout) {
8909
8917
  clearTimeout(this.setPositionTimeout);
8910
8918
  }
8911
- // Reset flag after a short delay to ensure scroll event is processed
8912
8919
  this.setPositionTimeout = setTimeout(() => {
8913
8920
  this.isSettingScrollPosition = false;
8914
8921
  this.setPositionTimeout = undefined;
8915
8922
  }, 0);
8916
8923
  }
8917
- /**
8918
- * Updates scrollbar thumb size and position based on content
8919
- */
8920
8924
  updateScrollbar() {
8921
8925
  const container = this.scrollContainer.nativeElement;
8926
+ if (this.hideTrack) {
8927
+ const newState = this.calculateScrollState();
8928
+ this.updateScrollState(newState);
8929
+ return;
8930
+ }
8922
8931
  const thumb = this.scrollThumb.nativeElement;
8932
+ const track = thumb.parentElement;
8923
8933
  const containerWidth = container.clientWidth;
8924
8934
  const contentWidth = container.scrollWidth;
8925
8935
  const scrollLeft = container.scrollLeft;
8926
- // Calculate thumb width as a ratio of visible content
8927
8936
  const thumbWidth = (containerWidth / contentWidth) * containerWidth;
8928
8937
  const thumbPosition = (scrollLeft / contentWidth) * containerWidth;
8929
- // Hide scrollbar if content fits within container
8930
8938
  const shouldShow = contentWidth > containerWidth;
8931
- this.renderer.setStyle(thumb.parentElement, 'opacity', shouldShow ? '1' : '0');
8932
- this.renderer.setStyle(thumb.parentElement, 'pointer-events', shouldShow ? 'auto' : 'none');
8933
- // Update thumb dimensions and position
8939
+ this.renderer.setStyle(track, 'opacity', shouldShow ? '1' : '0');
8940
+ this.renderer.setStyle(track, 'pointer-events', shouldShow ? 'auto' : 'none');
8934
8941
  this.renderer.setStyle(thumb, 'width', `${thumbWidth}px`);
8935
8942
  this.renderer.setStyle(thumb, 'transform', `translateX(${thumbPosition}px)`);
8936
- // Update scroll state after scrollbar update
8937
8943
  const newState = this.calculateScrollState();
8938
8944
  this.updateScrollState(newState);
8939
8945
  }
8940
- /**
8941
- * Observes container resize to update scrollbar
8942
- */
8943
8946
  setupResizeObserver() {
8944
8947
  const resizeObserver = new ResizeObserver(() => {
8945
8948
  this.updateScrollbar();
@@ -8950,129 +8953,132 @@ class StickyScrollbarComponent {
8950
8953
  resizeObserver.disconnect();
8951
8954
  });
8952
8955
  }
8953
- /**
8954
- * Updates scroll state and emits the state change event
8955
- */
8956
+ setupAlwaysVisibleTracking() {
8957
+ // Use IntersectionObserver for optimal performance - no layout thrashing
8958
+ const scrollbarTotalHeight = 10;
8959
+ const threshold = 10;
8960
+ // Shrink viewport to detect when scrollbar area is in the "safe zone"
8961
+ // The scrollbar appears at the bottom of the container, so we need to account for:
8962
+ // - threshold from top and bottom edges
8963
+ // - scrollbar height
8964
+ // - sticky offset
8965
+ const rootMarginTop = `-${threshold}px`;
8966
+ const rootMarginBottom = `-${scrollbarTotalHeight + threshold + this.stickyOffset}px`;
8967
+ const rootMargin = `${rootMarginTop} 0px ${rootMarginBottom} 0px`;
8968
+ this.intersectionObserver = new IntersectionObserver((entries) => {
8969
+ entries.forEach((entry) => {
8970
+ // When the container's bottom edge is in the "safe zone" (accounting for rootMargin),
8971
+ // isIntersecting will be true
8972
+ const newInViewValue = entry.isIntersecting;
8973
+ const rect = entry.boundingClientRect;
8974
+ this.isContainerInView.set(newInViewValue);
8975
+ this.updateFixedTrackPosition(rect);
8976
+ });
8977
+ }, {
8978
+ rootMargin: rootMargin,
8979
+ threshold: [0.25, 0.5, 0.75, 0.9, 0.99, 1],
8980
+ });
8981
+ this.intersectionObserver.observe(this.scrollContainer.nativeElement);
8982
+ }
8983
+ updateFixedTrackPosition(rect) {
8984
+ if (!this.alwaysVisible || this.hideTrack) {
8985
+ return;
8986
+ }
8987
+ const container = this.scrollContainer.nativeElement;
8988
+ const track = this.scrollThumb.nativeElement.parentElement;
8989
+ if (!track) {
8990
+ return;
8991
+ }
8992
+ // Only get rect if not provided (avoid duplicate getBoundingClientRect)
8993
+ const boundingRect = rect || container.getBoundingClientRect();
8994
+ if (this.isContainerInView()) {
8995
+ this.renderer.removeClass(track, 'fixed-mode');
8996
+ this.renderer.setStyle(track, 'position', 'sticky');
8997
+ this.renderer.removeStyle(track, 'left');
8998
+ this.renderer.removeStyle(track, 'width');
8999
+ }
9000
+ else {
9001
+ this.renderer.addClass(track, 'fixed-mode');
9002
+ this.renderer.setStyle(track, 'position', 'fixed');
9003
+ this.renderer.setStyle(track, 'left', `${boundingRect.left}px`);
9004
+ this.renderer.setStyle(track, 'width', `${boundingRect.width}px`);
9005
+ }
9006
+ }
8956
9007
  updateScrollState(newState) {
8957
9008
  if (this.currentScrollState !== newState) {
8958
9009
  this.currentScrollState = newState;
8959
9010
  this.scrollStateChange.emit(newState);
8960
9011
  }
8961
9012
  }
8962
- /**
8963
- * Calculates the scroll state based on current scroll position
8964
- */
8965
9013
  calculateScrollState() {
8966
9014
  const container = this.scrollContainer.nativeElement;
8967
9015
  const containerWidth = container.clientWidth;
8968
9016
  const contentWidth = container.scrollWidth;
8969
9017
  const scrollLeft = container.scrollLeft;
8970
9018
  const maxScroll = contentWidth - containerWidth;
8971
- // Check if scrollbar is not needed
8972
9019
  if (contentWidth <= containerWidth) {
8973
9020
  return eScrollState.NOT_NEEDED;
8974
9021
  }
8975
- // Determine scroll state based on position
8976
9022
  if (scrollLeft <= 1) {
8977
- // At the start (with small tolerance for rounding)
8978
9023
  return eScrollState.START;
8979
9024
  }
8980
- else if (scrollLeft >= maxScroll - 1) {
8981
- // At the end (with small tolerance for rounding)
9025
+ if (scrollLeft >= maxScroll - 1) {
8982
9026
  return eScrollState.END;
8983
9027
  }
8984
- else {
8985
- // In the middle
8986
- return eScrollState.SCROLLING;
8987
- }
9028
+ return eScrollState.SCROLLING;
8988
9029
  }
8989
- /**
8990
- * Handles scroll event on the container
8991
- */
8992
9030
  onScroll() {
8993
9031
  if (!this.isDragging) {
8994
9032
  this.updateScrollbar();
8995
9033
  }
8996
- // Emit scroll position only if it's user-initiated (not programmatically set)
8997
9034
  if (!this.isSettingScrollPosition) {
8998
- const container = this.scrollContainer.nativeElement;
8999
- const scrollLeft = container.scrollLeft;
9035
+ const scrollLeft = this.scrollContainer.nativeElement.scrollLeft;
9000
9036
  this.scrollPositionChange.emit(scrollLeft);
9001
- // Calculate and emit scroll state based on position
9002
9037
  const newState = this.calculateScrollState();
9003
9038
  this.updateScrollState(newState);
9004
9039
  }
9005
9040
  }
9006
- /**
9007
- * Handles mouse down on scrollbar thumb
9008
- */
9009
9041
  onThumbMouseDown(event) {
9010
9042
  event.preventDefault();
9011
9043
  event.stopPropagation();
9012
9044
  this.isDragging = true;
9013
9045
  this.dragStartX = event.clientX;
9014
9046
  this.scrollStartLeft = this.scrollContainer.nativeElement.scrollLeft;
9015
- // Emit drag start event
9016
- this.dragStart$.next(event);
9017
9047
  }
9018
- /**
9019
- * Sets up drag event listeners (called once during initialization)
9020
- */
9021
- setupDragListeners() {
9022
- const mouseMove$ = fromEvent(document, 'mousemove');
9023
- const mouseUp$ = fromEvent(document, 'mouseup');
9024
- // Handle mouse move - only active when dragging
9025
- mouseMove$
9026
- .pipe(filter(() => this.isDragging), takeUntilDestroyed(this.destroyRef))
9027
- .subscribe((event) => {
9048
+ onWindowMouseMove(event) {
9049
+ if (this.isDragging) {
9028
9050
  this.onThumbDrag(event);
9029
- });
9030
- // Handle mouse up - only active when dragging
9031
- mouseUp$
9032
- .pipe(filter(() => this.isDragging), takeUntilDestroyed(this.destroyRef))
9033
- .subscribe(() => {
9051
+ }
9052
+ }
9053
+ onWindowMouseUp() {
9054
+ if (this.isDragging) {
9034
9055
  this.onThumbMouseUp();
9035
- this.dragEnd$.next();
9036
- });
9056
+ }
9057
+ }
9058
+ onWindowMouseLeave() {
9059
+ if (this.isDragging) {
9060
+ this.onThumbMouseUp();
9061
+ }
9037
9062
  }
9038
- /**
9039
- * Handles thumb dragging
9040
- */
9041
9063
  onThumbDrag(event) {
9064
+ event.preventDefault();
9065
+ event.stopPropagation();
9042
9066
  const container = this.scrollContainer.nativeElement;
9043
9067
  const deltaX = event.clientX - this.dragStartX;
9044
- // Calculate scroll delta based on content/container ratio
9045
9068
  const containerWidth = container.clientWidth;
9046
9069
  const contentWidth = container.scrollWidth;
9047
9070
  const scrollDelta = (deltaX / containerWidth) * contentWidth;
9048
- // Update scroll position
9049
9071
  container.scrollLeft = this.scrollStartLeft + scrollDelta;
9050
- // Update scrollbar position during drag
9051
9072
  this.updateScrollbar();
9052
- // Emit the new scroll position
9053
- const scrollLeft = container.scrollLeft;
9054
- this.scrollPositionChange.emit(scrollLeft);
9055
- // Calculate and emit scroll state based on position
9056
- const newState = this.calculateScrollState();
9057
- this.updateScrollState(newState);
9073
+ this.scrollPositionChange.emit(container.scrollLeft);
9074
+ this.updateScrollState(this.calculateScrollState());
9058
9075
  }
9059
- /**
9060
- * Handles mouse up to end dragging
9061
- */
9062
9076
  onThumbMouseUp() {
9063
9077
  this.isDragging = false;
9064
9078
  }
9065
- /**
9066
- * Public method to manually refresh the scrollbar
9067
- * Useful when content or container dimensions change programmatically
9068
- */
9069
9079
  refresh() {
9070
9080
  this.updateScrollbar();
9071
9081
  }
9072
- /**
9073
- * Public method to scroll to the end of the container
9074
- * Useful when resizing the last element or when you want to ensure the end is visible
9075
- */
9076
9082
  scrollToEnd() {
9077
9083
  if (!this.scrollContainer) {
9078
9084
  return;
@@ -9082,27 +9088,22 @@ class StickyScrollbarComponent {
9082
9088
  this.isSettingScrollPosition = true;
9083
9089
  container.scrollLeft = maxScroll;
9084
9090
  this.updateScrollbar();
9085
- // Calculate and emit scroll state (should be END)
9086
- const newState = this.calculateScrollState();
9087
- this.updateScrollState(newState);
9088
- // Emit the new scroll position
9091
+ this.updateScrollState(this.calculateScrollState());
9089
9092
  this.scrollPositionChange.emit(maxScroll);
9090
- // Clear any existing timeout
9091
9093
  if (this.setPositionTimeout) {
9092
9094
  clearTimeout(this.setPositionTimeout);
9093
9095
  }
9094
- // Reset flag after a short delay to ensure scroll event is processed
9095
9096
  this.setPositionTimeout = setTimeout(() => {
9096
9097
  this.isSettingScrollPosition = false;
9097
9098
  this.setPositionTimeout = undefined;
9098
9099
  }, 0);
9099
9100
  }
9100
9101
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: StickyScrollbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: StickyScrollbarComponent, isStandalone: true, selector: "ca-sticky-scrollbar", inputs: { scrollPosition: "scrollPosition", hideTrack: "hideTrack", stickyOffset: "stickyOffset" }, outputs: { scrollPositionChange: "scrollPositionChange", scrollStateChange: "scrollStateChange" }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "scrollThumb", first: true, predicate: ["scrollThumb"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;height:6px;border-radius:2px;margin-top:1px;cursor:pointer;transition:opacity .1s ease-in-out;z-index:10}.sticky-scrollbar-track.hidden{display:none}.sticky-scrollbar-thumb{height:100%;background-color:#aaa;border-radius:2px;transition:background-color .1s ease-in-out,width .1s ease-in-out;cursor:grab;min-width:30px}.sticky-scrollbar-thumb:hover{background-color:#424242b2}.sticky-scrollbar-thumb.dragging{background-color:#424242b2;cursor:grabbing}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
9102
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: StickyScrollbarComponent, isStandalone: true, selector: "ca-sticky-scrollbar", inputs: { scrollPosition: "scrollPosition", hideTrack: "hideTrack", alwaysVisible: "alwaysVisible", stickyOffset: "stickyOffset" }, outputs: { scrollPositionChange: "scrollPositionChange", scrollStateChange: "scrollStateChange" }, host: { listeners: { "window:mousemove": "onWindowMouseMove($event)", "window:mouseup": "onWindowMouseUp()", "window:mouseleave": "onWindowMouseLeave()" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "scrollThumb", first: true, predicate: ["scrollThumb"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n @if (alwaysVisible && !isContainerInView()) {\n <div class=\"sticky-scrollbar-placeholder\"></div>\n }\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [class.always-visible]=\"alwaysVisible\"\n [class.fixed-mode]=\"alwaysVisible && !isContainerInView()\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;contain:layout style paint;will-change:scroll-position;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-placeholder{height:10px;visibility:hidden;pointer-events:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;overflow-y:visible;height:10px;display:flex;align-items:center;border-radius:2px;margin-top:0;margin-bottom:0;transition:opacity .1s ease-in-out;z-index:10}.sticky-scrollbar-track.hidden{display:none}.sticky-scrollbar-track.always-visible{z-index:1000}.sticky-scrollbar-track.always-visible.fixed-mode{margin:0}.sticky-scrollbar-thumb{position:relative;height:6px;background-color:#aaa;border-radius:2px;transition:background-color .1s ease-in-out,width .1s ease-in-out;cursor:grab;min-width:30px;will-change:transform,width;transform:translateZ(0)}.sticky-scrollbar-thumb:before{content:\"\";position:absolute;top:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:hover{background-color:#424242b2}.sticky-scrollbar-thumb.dragging{background-color:#424242b2;cursor:grabbing}.sticky-scrollbar-thumb.dragging:before,.sticky-scrollbar-thumb.dragging:after{cursor:grabbing}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
9102
9103
  }
9103
9104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: StickyScrollbarComponent, decorators: [{
9104
9105
  type: Component,
9105
- args: [{ selector: 'ca-sticky-scrollbar', imports: [CommonModule], template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;height:6px;border-radius:2px;margin-top:1px;cursor:pointer;transition:opacity .1s ease-in-out;z-index:10}.sticky-scrollbar-track.hidden{display:none}.sticky-scrollbar-thumb{height:100%;background-color:#aaa;border-radius:2px;transition:background-color .1s ease-in-out,width .1s ease-in-out;cursor:grab;min-width:30px}.sticky-scrollbar-thumb:hover{background-color:#424242b2}.sticky-scrollbar-thumb.dragging{background-color:#424242b2;cursor:grabbing}\n"] }]
9106
+ args: [{ selector: 'ca-sticky-scrollbar', imports: [CommonModule], template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n @if (alwaysVisible && !isContainerInView()) {\n <div class=\"sticky-scrollbar-placeholder\"></div>\n }\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [class.always-visible]=\"alwaysVisible\"\n [class.fixed-mode]=\"alwaysVisible && !isContainerInView()\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;contain:layout style paint;will-change:scroll-position;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-placeholder{height:10px;visibility:hidden;pointer-events:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;overflow-y:visible;height:10px;display:flex;align-items:center;border-radius:2px;margin-top:0;margin-bottom:0;transition:opacity .1s ease-in-out;z-index:10}.sticky-scrollbar-track.hidden{display:none}.sticky-scrollbar-track.always-visible{z-index:1000}.sticky-scrollbar-track.always-visible.fixed-mode{margin:0}.sticky-scrollbar-thumb{position:relative;height:6px;background-color:#aaa;border-radius:2px;transition:background-color .1s ease-in-out,width .1s ease-in-out;cursor:grab;min-width:30px;will-change:transform,width;transform:translateZ(0)}.sticky-scrollbar-thumb:before{content:\"\";position:absolute;top:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:hover{background-color:#424242b2}.sticky-scrollbar-thumb.dragging{background-color:#424242b2;cursor:grabbing}.sticky-scrollbar-thumb.dragging:before,.sticky-scrollbar-thumb.dragging:after{cursor:grabbing}\n"] }]
9106
9107
  }], propDecorators: { scrollContainer: [{
9107
9108
  type: ViewChild,
9108
9109
  args: ['scrollContainer', { static: false }]
@@ -9113,12 +9114,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
9113
9114
  type: Input
9114
9115
  }], hideTrack: [{
9115
9116
  type: Input
9117
+ }], alwaysVisible: [{
9118
+ type: Input
9116
9119
  }], stickyOffset: [{
9117
9120
  type: Input
9118
9121
  }], scrollPositionChange: [{
9119
9122
  type: Output
9120
9123
  }], scrollStateChange: [{
9121
9124
  type: Output
9125
+ }], onWindowMouseMove: [{
9126
+ type: HostListener,
9127
+ args: ['window:mousemove', ['$event']]
9128
+ }], onWindowMouseUp: [{
9129
+ type: HostListener,
9130
+ args: ['window:mouseup']
9131
+ }], onWindowMouseLeave: [{
9132
+ type: HostListener,
9133
+ args: ['window:mouseleave']
9122
9134
  }] } });
9123
9135
 
9124
9136
  class DispatchSearchFilterPipe {